Подтвердить что ты не робот

IOS 10.3: NSStrikethroughStyleAttributeName не отображается, если применяется к поддиапазону NSMutableAttributedString

Зачеркнутый (одиночный, двойной,...), добавленный как атрибут к экземпляру 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

4b9b3361

Ответ 1

Добавив NSBaselineOffsetAttributeName, как описано здесь, к атрибутной строке возвращается строка зачеркивания. Переопределение drawText:in: может быть медленным, особенно в ячейках Collection View или Table View.

Ответ 2

Настройка смещения базовой линии, похоже, исправляет ее:

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

Это известная ошибка в iOS 10.3

Ответ 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.

Ответ 4

Рабочий рабочий файл 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

Ответ 5

Его ошибка, известная 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

Swift 4

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

Ответ 7

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