2016-01-28 80 views
1

我注意到,在一些字体,如果对它们的帧大小由NSAttributedString.size或boundingRectWithSize确定一些符号显示不正确的的UILabel的一些字体。例如,我选择字体AvenirNext-粗体,符号“A”,并设置的pointsize到300计算帧(宽度= 218.69999999999999,高度= 409.80000000000001)。我把这个角色放在上述尺寸的框架中。时候切断的UILabel符号因为在字体符号参数

enter image description here

正如你可以在图片中看到,切断了显示标签的部分突出显示为红色框。我检查了其他几种字体,并注意到它始终在发生。我可以摆脱这一点,而不必更改UILabel的框架并更正字体中符号的边距。使用第三方程序,我发现,对于字体AvenirNext粗体,字符“A”,左,右页边距等于-1.39。

enter image description here

是否有人知道的任何技术来解决这个问题?

附加:

enter image description here

如果你对你的MAC OS开放字体的应用程序,并找到艾文莉接下来加粗字体,你可以看到这个切断。

代码:

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

你试过“label.clipToBounds =假' –

+0

大卫威廉姆斯,是的,我尝试过。 –

+0

请显示需要重现的实际代码。 – matt

回答

1

我想你已经注意到这里基本上是我注意到in my book,这些尺寸计算,如boundingRectWithSize:options:context:和NSAttributedString的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); 
+0

谢谢马特为您例如, 不幸的解决方案不能解决所有问题。如果你设置参数textAlignment = NSTextAlignmentRight;你可以看到符号仍然被剪切。 –

+0

所以不要那样做。我已经告诉过你,边际被忽略了。如果你运行我给你的代码,字形看起来很好。不要告诉我,如果你运行其他代码,那是我的错。 – matt

+0

您的代码工作正常。但不幸的是,它并没有解决所有问题。我在寻找,这将是通用的所有字体,它可以包含以字符等问题的解决方案,无论其他参数(textAlignment和其他)。 –