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

Установка смещения базовой линии, как представляется, исправить:

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

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

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

Обнаружено обходное решение для нашего конкретного сценария (мы не указываем стиль с свойствами 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) } } } 

ПРИМЕЧАНИЕ. Если вы смешиваете свойства стиля NSAttributedString атрибутами NSAttributedString , вам следует подумать о создании новой атрибутивной строки перед рендерингом, применить к ней стиль UILabel, а затем повторно применить к нему все attributedText атрибутаText.

быстрый рабочий код 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) 
 (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)); } 
  • Определение подкадров UIScrollView в системе координат в представлении контейнера UIScrollView
  • Переместить UIImageView
  • UIViewPropertyAnimator отличается от поведения iOS10 и iOS11, изменяя анимацию. Ошибка в свойствах `isReversed` и` fractionComplete`?
  • UICollectionView перестает загружать ячейки после moveItemAtIndexPath: toIndexPath:
  • UIPanGestureRecognizer.maximumNumberOfTouches не соблюдается в вложенных представлениях прокрутки?
  • Слабая ссылка UIPopoverBackgroundView
  • UITableViewDelegate и UITableViewDatasource путают
  • Как реагировать только на жест одного касания, позволяя объектам реагировать на двойные нажатия?
  • Авария UIDatePicker: не удалось выделить 100 000 строк
  • «Неизвестный класс в файле построителя интерфейса» при использовании класса, который наследуется от общего класса в раскадровке
  • Как я могу программно уволить / отключить всплывающее окно, которое было введено в iOS 11?
  • Давайте будем гением компьютера.