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);

你可能感兴趣的:(iOS)