Ответ 1
Добавив NSBaselineOffsetAttributeName
, как описано здесь, к атрибутной строке возвращается строка зачеркивания. Переопределение drawText:in:
может быть медленным, особенно в ячейках Collection View или Table View.
Зачеркнутый (одиночный, двойной,...), добавленный как атрибут к экземпляру NSMutableAttributedString
, не отображается, если диапазон применения не является целым диапазоном строк.
Это происходит с использованием addAttribute(_ name: String, value: Any, range: NSRange)
, insert(_ attrString: NSAttributedString, at loc: Int)
, append(_ attrString: NSAttributedString)
,...
Сломанный Apple в ранних версиях IOS 10.3 и не зафиксирован в финале 10.3.
Кредит: https://openradar.appspot.com/31034683
Добавив NSBaselineOffsetAttributeName
, как описано здесь, к атрибутной строке возвращается строка зачеркивания. Переопределение drawText:in:
может быть медленным, особенно в ячейках Collection View или Table View.
Настройка смещения базовой линии, похоже, исправляет ее:
[attributedStr addAttribute:NSBaselineOffsetAttributeName value:@0 range:NSMakeRange(0, 10)];
[attributedStr addAttribute:NSStrikethroughStyleAttributeName value:@2 range:NSMakeRange(0, 10)];
Это известная ошибка в iOS 10.3
Обнаружено обходное решение для нашего конкретного сценария (мы не указываем стиль с свойствами 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
.
Рабочий рабочий файл swift 3 с 10,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, с этим обходным путем. НЕТ дополнительной строки кода необходимо, просто добавьте [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)
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
(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));
}