我有一个显示希腊文字的应用。我使用Cardo字体进行良好显示。在使用AppleWatch扩展程序和应用程序时,有人向我指出某些特殊字符正在被切断。这是一些示例文本的外观(来自iPhone模拟器的屏幕截图):
以下是Watch模拟器上的相同文字:
请注意,第一个单词的第二个字符上的花哨重音字符(具体而言,具有回音重音的呼吸标记)被切断。我尝试使用一些NSString
测量代码在手机上设置标签的框架,如下所示:
UILabel *label = [[UILabel alloc]init];
label.font = [UIFont fontWithName:@"Cardo" size:16];
[self.view addSubview:label];
label.text = @"οὗτος ἦλθεν εἰς μαρτυρίαν ἵνα μαρτυρήσῃ περὶ τοῦ φωτός, ἵνα πάντες πιστεύσωσιν δι᾽ αὐτοῦ.";
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc]init];
style.lineBreakMode = NSLineBreakByWordWrapping;
CGRect rect = [label.text boundingRectWithSize:self.view.bounds.size
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: label.font,
NSParagraphStyleAttributeName: style} context:nil];
label.frame = CGRectMake(5, 100, ceilf(rect.size.width), ceilf(rect.size.height));
label.layer.borderWidth = 1; //for clarity
label.layer.borderColor = [UIColor blackColor].CGColor;
结果如下所示(边框是为了清晰起见而绘制的):
有趣的是,如果我使用系统字体而不是Cardo,额外的符号会正确显示:
那么,我的问题:是什么原因导致NSString
尺寸缩小了额外的标记?是否有一些选项我可以传递给大小调整方法来纠正这个问题?或者更好的是,我可以在Watch应用程序的WKInterfaceLabel
上设置一些选项以使其正确呈现吗?
答案 0 :(得分:2)
我不知道这是否会解决,但这会让你有更多的东西要研究。我使用" Lower Case"遇到了一个字体问题。数字,这是表格数字的排版样式。我能够使用UIFontDescription创建字体的变体,强制所有数字都是大写。在你的情况下,字体的上升器会超过字体的capHeight顶部。使用字体描述符创建字体有很多选项,其中一个可能会有所帮助。以下是我创建大写数字字体的方法。
_font = [UIFont fontWithName:_fontName size:size];
NSArray* featureSettings = @[
@{
UIFontFeatureTypeIdentifierKey: @(kNumberCaseType),
UIFontFeatureSelectorIdentifierKey: @(kUpperCaseNumbersSelector)
}];
UIFontDescriptor* originalDescriptor = [_font fontDescriptor];
UIFontDescriptor* newDescriptor = [originalDescriptor fontDescriptorByAddingAttributes: @{UIFontDescriptorFeatureSettingsAttribute: featureSettings }];
_font = [UIFont fontWithDescriptor: newDescriptor size: size];
具体检查kVerticalPositionType。
我实际上在我的iOS应用程序中遇到了一个案例,其中字体上升从基线向上超过capHeight并且我的属性字符串被切断了。因为我在石英绘图代码中,我只是使用字体的lineHeight与其上升器的区别并填充顶部。不幸的是,这不是Apple Watch的一个选项。
答案 1 :(得分:1)
我怀疑问题出现在字体本身,因为上升器设置得太紧而无法正常显示。
我首先尝试通过创建UILabel的子类并覆盖drawTextInRect来设置UILabel的文本插入:
- (void)drawTextInRect:(CGRect)rect {
UIEdgeInsets insets = {5, 0, 0, 0};
[super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
如果您尝试增加文字插图以容纳字体并且无效,请查看Custom installed font not displayed correctly in UILabel