博客> iOS10.3以后UILabel富文本属性不起作用
iOS10.3以后UILabel富文本属性不起作用
2017-09-23 17:42 评论:0 阅读:209 梧桐一叶
UIlabel 富文本 删除线 iOS10.3
   自从手机升级了10.3.1以后,发现一个奇怪的现象,之前写的那些带删除线的label的删除线全没了,感觉很是奇怪,我又没有动代码,还是以前的老代码,删除线怎么就没有了呢?除了自己系统是10.3.1的手机以外,发现系统是10.0.2的手机上并不存在这个问题,这个现象就越发奇怪了,不得不让我怀疑这个是不是和手机系统有关呢?还有一个可能是我刚升级了Xcode8.3.2,会不会是Swift3.1的语法问题呢?经过一番查阅资料后,终于得出了结论,这个和Swift3.1语言无关,是和手机系统版本有关,这个也可以理解成苹果10.3系统的bug

  下面还原一下老代码:

let testLabel = UILabel.init(frame: CGRect(x:15,y:300,width:100,height:40)) let attStr = NSMutableAttributedString.init(string: "演示演示") attStr.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 12), range: NSRange(location: 0,length: 2)) attStr.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 20), range: NSRange(location: 2,length: 2)) attStr.addAttribute(NSStrikethroughStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0,length: 4)) testLabel.attributedText = attStr self.view.addSubview(testLabel) 注意:这段代码在10.3以下的版本是没有任何问题的,为了暂时兼顾iOS各个版本,暂时的解决办法是封装了一个继承自UILabel的子类AttibutedLabel,里面对10.3系统区别对待就可以了,代码如下: class AttibutedLabel: UILabel {

/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
    // Drawing code
}
*/

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

}

为了验证这段代码是否可行,创建一个AttibutedLabel的对象试一试,代码如下: let attStr = NSMutableAttributedString.init(string: "演示演示") attStr.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 12), range: NSRange(location: 0,length: 2)) attStr.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 20), range: NSRange(location: 2,length: 2)) attStr.addAttribute(NSStrikethroughStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0,length: 4)) let strikethroughLabel = DeleteLineLabel.init(frame: CGRect(x:15,y:350,width:100,height:40)) strikethroughLabel.attributedText = attStr self.view.addSubview(strikethroughLabel)

对所查资料整理了以下,希望对大家有所帮助 主要参考资料:http://stackoverflow.com/questions/42478697/swift-3-1-nssuperscript-in-nsattributedstring-not-working-as-expected/43074313

收藏
1
sina weixin mail 回到顶部