iOS 10.3:如果应用于NSMutableAttributedString的子范围,则不呈现NSStrikethroughStyleAttributeName

如果应用范围不是整个string范围,则不会呈现作为属性添加到NSMutableAttributedString实例的删除线(单,双,…)。

这发生在addAttribute(_ name: String, value: Any, range: NSRange)insert(_ attrString: NSAttributedString, at loc: Int)append(_ attrString: NSAttributedString) ,…

苹果公司在早期的iOS 10.3 beta版中被打破了,而在10.3的最终版本中没有被修复。

信用: https : //openradar.appspot.com/31034683

NSBaselineOffsetAttributeName ,将一个NSBaselineOffsetAttributeName添加到属性string将带回删除线。 重写drawText:in:可以慢,特别是在集合视图或表格视图单元格上。

设置基线偏移似乎解决了这个问题:

 [attributedStr addAttribute:NSBaselineOffsetAttributeName value:@0 range:NSMakeRange(0, 10)]; [attributedStr addAttribute:NSStrikethroughStyleAttributeName value:@2 range:NSMakeRange(0, 10)]; 

这是iOS 10.3中的一个已知错误

find一个解决scheme为我们的具体情况(我们没有指定任何样式与UILabel的属性,但所有与NSAttributedString属性):

 /// This UILabel subclass accomodates conditional fix for NSAttributedString rendering broken by Apple in iOS 10.3 final class PriceLabel: UILabel { override func drawText(in rect: CGRect) { guard let attributedText = attributedText else { super.drawText(in: rect) return } if #available(iOS 10.3, *) { attributedText.draw(in: rect) } else { super.drawText(in: rect) } } } 

注意:如果将UILabel的样式属性与NSAttributedString属性混合,则应该考虑在渲染前创build新的属性string,在其上应用UILabel的样式,然后重新应用所有的attributedText NSAttributedString属性。

迅速3个工作代码与10.3testing

 let attributeString: NSMutableAttributedString = NSMutableAttributedString(string: "₹3500") attributeString.addAttribute(NSBaselineOffsetAttributeName, value: 0, range: NSMakeRange(0, attributeString.length)) attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 1, range: NSMakeRange(0, attributeString.length)) productPriceLabel.attributedText = attributeString 

它是一个Xcode 8.3(8E3004b)/ iOS 10.3已知的bug,使用这种解决方法不需要额外的代码行,只需在声明NSMutableAttributedString()时添加[NSBaselineOffsetAttributeName:0]

 let attrStr = NSMutableAttributedString(string: YOUR_STRING_HERE, attributes: [NSBaselineOffsetAttributeName : 0]) // Now if you add the strike-through attribute to a range, it will work attrStr.addAttributes([ NSFontAttributeName: UIFont.boldSystemFont(ofSize: 24), NSStrikethroughStyleAttributeName: 1 ], range: NSRange) 
 (void)drawRect:(CGRect)rect{ [super drawRect:rect]; // 取文字的颜色作为删除线的颜色[self.textColor set]; CGFloat w = rect.size.width; CGFloat h = rect.size.height; // 绘制(0.5是label的中间位置,可以自己调整) UIRectFill(CGRectMake(0, h * 0.5, w, 1)); }