iOS Xcode UILabel右邊緣出現黑線
阿新 • • 發佈:2019-01-02
偶爾發現UILabel右邊緣出現黑線,iPhone6P、6sP最為明顯
用Xcode的debug view hierarchy仔細看了多遍,都沒毛病,層次分明,該Hidden的hide了,該透明的透明瞭,只有這條線完全不知怎麼回事兒。
- 猜測1 border
懷疑label.layer.border有問題,導致出現黑線,但是border是UIView.layer的邊緣上的一條線,四條邊都有才對。現在的問題是隻有右邊有線,排除之。 猜測2 UILabel.attributeString
因為UI指定了該Label的行間距,所以這裡的label.text使用UILabel.attributeString來賦值,懷疑是attributeString的副作用。然而換成label.text後,仍然有相同的問題。絞盡腦汁苦想半天,一籌莫展,於是我假裝沒看見這個bug,繼續coding別的夢想去….直到幾天後,團隊中另一位大牛發現了這個問題。他興致勃勃的跟我談這個bug,跟我一樣,他也試了N個猜想,都不是真正的原因,但不同的是,他對疑難雜症有一種偏執的熱愛。所以,當我看到他眼中充滿興奮的綠光時,我也被他感染了,我們同仇敵愾跟這條黑線死磕到底!
功夫不負有心人,終於從某技術論壇發現正解:使用迴圈計算label尺寸, 迴圈建立label時有可能出現右邊緣黑線的問題,
且有時在iPhone5s一下機型不會出現, 只在iPhone6以上出現
這是因為計算出得size可能的值會是30.31123323…… 這樣的數,
猜想: 而畫素值顯示的時候不可能出現顯示半個畫素的情況, 那麼不足一個畫素的值就會被忽略掉, 在解析度較低的機型上不會出現, 而解析度較高的則不會忽略, 就出現了黑線。
解決方法
計算出來的UILabel尺寸,向上取整
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping ;
[paragraphStyle setLineSpacing:4];
NSDictionary *attributes = @{NSFontAttributeName:kDesFont, NSParagraphStyleAttributeName:paragraphStyle.copy};
CGSize size = [ des boundingRectWithSize:CGSizeMake(cellWidth, 0) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil ].size ;
size.width = ceil(size.width);
size.height = ceil(height);