iOS 10.3:如果应用于NSMutableAttributeString的子范围,则不会呈现NSStrikethrowStyleAttributeName

iOS 10.3:如果应用于NSMutableAttributeString的子范围,则不会呈现NSStrikethrowStyleAttributeName,ios,swift,uikit,Ios,Swift,Uikit,如果应用范围不是整个字符串范围,则作为属性添加到NSMutableAttributedString实例的删除线(单、双、…)不会呈现 使用addAttribute(uu名称:字符串,值:任意,范围:NSRange),插入(uAttrString:NSAttributedString,在loc:Int处),追加(attrString:NSAttributedString) 在iOS 10.3 Beta早期被苹果打破,在10.3决赛中未修复 学分: 为我们的特定场景找到了一个解决方案(我们不使用UI

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

使用
addAttribute(uu名称:字符串,值:任意,范围:NSRange)
插入(uAttrString:NSAttributedString,在loc:Int处)
追加(attrString:NSAttributedString)

在iOS 10.3 Beta早期被苹果打破,在10.3决赛中未修复

学分:

为我们的特定场景找到了一个解决方案(我们不使用UILabel的属性指定任何样式,但都使用
NSAttributedString
属性):


注意:如果将UILabel的样式属性与
NSAttributedString
属性混合使用,则应考虑在渲染之前创建一个新的属性字符串,在其上应用UILabel的样式,然后在其上重新应用所有
attributedText
属性。

添加
NSBaselineOffsetAttribute Name
,如前所述,对于属性字符串,返回删除线。覆盖
drawText:in:
可能会很慢,尤其是在集合视图或表视图单元格上。

设置基线偏移似乎可以解决这一问题:

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

这是iOS 10.3中已知的使用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

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

斯威夫特4
对于Swift 5
NSBaselineOffsetAttribute Name
来说,随着
KCTBaselineOffsetAttribute Name
的变化,每一个新版本都会发生变化。

这让我一整天都很难受,很高兴你找到了一个值得的解决方案,我还发现对于iOS 10.3版本,属性字符串不会使用UILabel属性上设置的字体样式呈现。例如,如果您使用的是属性文本属性,那么仅指定UILabel的字体类型是不够的。您必须通过NSFontAttributeName将所需字体作为属性。当我如您所说重写drawText函数时,它将忽略我在序列图像板中提供的所有标签样式(对齐、字体、颜色)。还有什么方法可以将所有这些样式强制转换为NSMutableAttributedString的属性吗?@Mohammadalijf这就是我在答案下面的注释中所做的-从标签的属性中读取它们,并作为
NSAttributedString
属性重新应用。你挽救了这一天!:这也适用于上标和下标属性。它可以工作,但我怀疑“NSBaselineOffsetAttributeName”的默认值为零。那么为什么我们需要设置这个值呢?这显然是一个bug,所以它必须在iOS 10.3.2 beta 2Doe中修复一些渲染副作用。在10.3.2当前版本中似乎不起作用,但它在iOS 11中起作用。太好了!必须花费将近一个小时来找出那些键
NSAttributedStringKey.StreetThroughStyle
等。重点是使用
NSUnderlineStyle.styleSingle.rawValue
而不是
NSUnderlineStyle.styleSingle
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
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)
let text = "Hello World"
let textRange = NSMakeRange(0, text.count)
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttribute(NSAttributedStringKey.strikethroughStyle,
                            value: NSUnderlineStyle.styleSingle.rawValue,
                            range: textRange)
myLabel.attributedText = attributedText