1. 程式人生 > >iOS Xcode UILabel右邊緣出現黑線

iOS Xcode UILabel右邊緣出現黑線

偶爾發現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);