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版中解决。

作为一种解决方法,您可以将UITextViewreplace为其他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;