我注意到,在某些字体中,如果它们的帧大小由NSAttributedString.size或boundingRectWithSize确定,则某些符号在UILabel中显示不正确。例如,我选择字体AvenirNext-Bold,符号“A”,并将pointSize设置为300.计算框架(宽度= 218.69999999999999,高度= 409.80000000000001)。我把那个角色放在上面那个大小的框架里。
正如您在图片中看到的那样,切断显示标签的部分会在红色框中突出显示。我查了几个其他字体,发现它一直都在发生。我可以摆脱这个,而不必改变UILabel的框架并修正字体中符号的边距吗?使用第三方程序,我发现,对于字体AvenirNext-Bold,对于字符“A”,左右边距等于-1.39。
有人知道解决此问题的任何技巧吗?
其他:
如果您在MAC OS上打开字体应用程序,并找到Avenir Next Bold字体,您可以看到这种切断。
代码:
NSString *text = @"A";
NSString *fontName = @"AvenirNext-Bold";
CGFloat pointSize = 300.f;
UIFont *font = [UIFont fontWithName:fontName size:pointSize];
CGSize size = [text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
self.label.text = text;
self.label.font = font;
self.label.frame = CGRectMake((self.view.bounds.size.width - size.width) / 2.f, (self.view.bounds.size.height - size.height) / 2.f, size.width, size.height);
其他字体: 您可以将字体更改为BodoniSvtyTwoITCTT-BookIta。
答案 0 :(得分:1)
我认为您在此处注意到的与我in my book基本相同的现象是这些大小计算,例如boundingRectWithSize:options:context:
和NSAttributedString' s size
,忽略边距。
在这种情况下,您可以通过提供自己的额外保证金来解决问题(尽管如何计算金额,除了任意之外,让我逃避):
NSString *text = @"A";
NSString *fontName = @"AvenirNext-Bold";
CGFloat pointSize = 300.f;
UIFont *font = [UIFont fontWithName:fontName size:pointSize];
CGFloat margin = 10;
NSMutableAttributedString* s = [[NSMutableAttributedString alloc] initWithString:text];
[s addAttribute:NSFontAttributeName value:font range:NSMakeRange(0,s.length)];
NSMutableParagraphStyle* p = [NSMutableParagraphStyle new];
p.firstLineHeadIndent = margin;
p.tailIndent = -margin; // in case of right alignment
[s addAttribute:NSParagraphStyleAttributeName value:p range:NSMakeRange(0,s.length)];
CGSize size = [s size];
self.label.attributedText = s;
self.label.frame = CGRectMake((self.view.bounds.size.width - size.width) / 2.f, (self.view.bounds.size.height - size.height) / 2.f, size.width+margin*2, size.height);