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

时间:2017-03-28 16:11:08

标签: ios swift uikit

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

使用addAttribute(_ name: String, value: Any, range: NSRange)insert(_ attrString: NSAttributedString, at loc: Int)append(_ attrString: NSAttributedString),...

会发生这种情况

在早期的iOS 10.3测试版中被Apple破解,并未在10.3决赛中修复。

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

7 个答案:

答案 0 :(得分:87)

设置基线偏移似乎可以解决它:

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

这是iOS 10.3中已知的bug

答案 1 :(得分:24)

NSBaselineOffsetAttributeName添加到here,对于属性字符串会带回删除线。覆盖drawText:in:可能会很慢,特别是在Collection View或Table View Cells上。

答案 2 :(得分:14)

为我们的特定方案找到了一种解决方法(我们不指定任何具有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属性混合在一起,你应该考虑在渲染之前创建一个新的属性字符串,在其上应用UILabel的样式,然后重新应用所有attributedText的属性。

答案 3 :(得分:10)

用10.3

测试的swift 3工作代码
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

答案 4 :(得分:10)

Swift 4

$ bash redirect.sh 8000 192.168.1.10/app1
$ bash redirect.sh 8001 192.168.1.11/app1

答案 5 :(得分:4)

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

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)

答案 6 :(得分:0)

对于Swift 5,NSBaselineOffsetAttributeName已被kCTBaselineOffsetAttributeName更改,并将更改每个新版本。