UITextView在iOS 7中错误地呈现自定义字体
我的应用程序使用UITextView来inputSyriac文本(Estrangelo字体),但UITextView渲染一些字母不正确,像这样:
我用UILabel和UITextViewtesting了它。 UILabel显示正确,但UITextView不正确地显示顶部的点,并将其移动到底部(见上面的结果)。
这个问题只发生在iOS 7中,不会发生在iOS 6中。请告诉我,如果有任何方法来解决这个问题。
这是我的testing代码
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 40)]; label.center = CGPointMake(self.view.center.x, self.view.center.y-40); label.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24]; label.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃"; [self.view addSubview:label]; UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)]; textView.center = CGPointMake(self.view.center.x, self.view.center.y+40); textView.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24]; textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃"; [self.view addSubview:textView];
我debugging了一下这个问题,它似乎是NSLayoutManager
布局文本的方式的错误。 正如其他答案指出, UITextView
是围绕TextKitbuild立自iOS7以来,因此内部使用NSLayoutManager
布局文本。 UILabel
使用核心文本直接排列文本。 两者最终都使用核心文本来渲染字形。
您应该打开与苹果公司的错误报告,并张贴数字,以便人们可以复制它。 这个问题到目前为止还没有在iOS7.1 beta版中解决。
作为一种解决方法,您可以将UITextView
replace为其他Core Text替代编辑器,这些替代编辑器直接用Core Text进行布局和渲染,而问题不存在。
我testing了SECoreTextView
,它显示正确的文本。 它实现了一个类似于UITextView
API,但内部使用了Core Text。
这是它交换UITextView
SECoreTextView
后的SECoreTextView
:
SETextView *textView = [[SETextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)]; textView.center = CGPointMake(self.view.center.x, self.view.center.y+40); textView.font = [UIFont fontWithDescriptor:desc size:24]; textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃"; textView.textColor = [UIColor blackColor]; textView.backgroundColor = [UIColor whiteColor]; textView.editable = YES; [self.view addSubview:textView];
几天前,我有和iOS 7
一样的问题(但是字体不同) 。 设置TEXT后,我设置了FONT ,它对我有用 。 所以对于你的情况:
textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃"; // Setting the text. textView.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24]; // Setting the font and it's size.
这可能看起来很愚蠢,但它对我有用。
也看到这个问题/答案 。 有很多与UITextView
使用自定义字体的技巧,这可能会对你有帮助。
编辑:
iOS 7还在UITextView
上引入了一个新的selectable
属性来启用文本select。 所以请确保你已经完成了以下工作:
self.textField.editable = YES; self.textField.selectable = ON;