在使用某些字体时,iOS 8.1中的UITextField在编辑和非编辑模式之间具有不同的垂直文本对齐

Dio*_*o T 9 objective-c uitextview ios ios8

在使用Helvetica Neue Light 17等字体时,iOS 8.1.X中的UITextField在编辑和非编辑模式之间具有不同的垂直文本对齐:

UITextField错误示例

这里有一个示例项目.

是否有一种解决方法,我不需要创建自定义文本字段?主要问题是当使用动态类型时,字体可以在运行时更改.

无论如何,我开了一个雷达rdar:// 19374610.

Pab*_*rez -1

这个错误与字体相关,因此我将采用一个解决方案来设置属性字符串的样式来弥补这一点。

使用 Helvetica Neue Light 和尺寸 17 修复第一个文本字段的示例:

假设视图控制器是firstTextField的委托

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSDictionary *style = @{
        NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light"
                                              size:17],
        NSParagraphStyleAttributeName : [NSParagraphStyle defaultParagraphStyle],
        NSBaselineOffsetAttributeName: @(0.4)
};
_firstTextField.attributedText = [[NSAttributedString alloc] initWithString:_firstTextField.text
                                                                 attributes:style];

}
-(void)textFieldDidBeginEditing:(UITextField *)textField {
NSDictionary *style = @{
        NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light"
                                              size:17],
        NSParagraphStyleAttributeName : [NSParagraphStyle defaultParagraphStyle],
        NSBaselineOffsetAttributeName: @(0.0)

};
[_firstTextField setTypingAttributes: style];
}
Run Code Online (Sandbox Code Playgroud)

关键部分是从呈现文本字段到编辑文本字段时设置 NSBaselineAlignment 的时间。我还检查了当字体为双倍大小(文本字段足够大)并且 NSBaselineOffset 仍然相同以避免跳跃效果时会发生什么。