2016-01-28 82 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和其他)。 –