UITextView在iOS 7中错误地呈现自定义字体

时间:2014-01-21 04:05:39

标签: ios7 uitextview multilingual right-to-left custom-font

我的应用使用UITextView输入Syriac文本(Estrangelo字体),但是UITextView会像这样错误地呈现一些字母:

enter image description here

我用UILabel和UITextView测试了它。 UILabel正确显示它,但UITextView错误地显示顶部点并将它们移动到底部(参见上面的结果)。

此问题仅发生在iOS 7中,并且在iOS 6中不会发生。请告诉我是否有任何方法可以解决问题。

这是my test code

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];

2 个答案:

答案 0 :(得分:6)

我稍微调试了这个问题,它似乎是NSLayoutManager布局文本的方式中的一个错误。正如其他答案所指出的,UITextView是自iOS7以来围绕TextKit构建的,因此在内部使用NSLayoutManager来布局文本。 UILabel使用Core Text直接布局文本。两者最终都使用Core Text来渲染字形。

您应该向Apple打开一个错误报告并发布该号码,以便人们可以复制它。到目前为止,这个问题在iOS7.1测试版中尚未解决。

作为一种变通方法,您可以将UITextView替换为其他Core Text替代编辑器,这些编辑器直接使用Core Text进行布局和渲染,但问题不存在。

我测试了SECoreTextView,它正确显示了文字。它实现了与UITextView类似的API,但内部使用了Core Text。

以下是UITextViewSECoreTextView交换后的展示方式:

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];

Using Core Text, the layout issue does not exist.

答案 1 :(得分:2)

前几天,我在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.

看起来很傻,但它对我有用。

另见question/answer。使用UITextView的自定义字体有很多提示,这可能会对您有所帮助。

编辑:

iOS 7还在selectable上引入了新的UITextView属性,用于启用文本选择。因此,请确保您已完成以下操作:

self.textField.editable = YES;
self.textField.selectable = ON;