Swift 3.1 - NSSuperScript в NSAttributedString не работает должным образом

Приложение, над которым я работаю, столкнулось с проблемой при тестировании с iOS 10.3 Simulator через XCode 8.3 beta 2, где верхний индекс в AttributedString отображается в одной строке с обычным текстом. Для iOS 10.2.x и ниже, он отображается правильно.

Снимок экрана iOS 10.3: https://www.dropbox.com/s/p5v71g722cg5qhy/Screen%20Shot%202017-02-21%20at%2010.24.21%20AM.png?dl=0

Скриншот для iOS 10.2.x и ниже: https://www.dropbox.com/s/lcfsic6xyz953qp/Screen%20Shot%202017-02-21%20at%2010.19.17%20AM.png?dl=0

Вот как я обработал текст:

  • Изначально строка в формате HTML, а тег для текста "8,9" выше

<html>  
<head>  
     <style> body { color: #554344 ; font-family: \'MyCustomFont\'; font-size: 18px; } sup { font-size: 13px; } </style>  
</head>  
<body>  
     ABCdef<sup>1,2,3,8,9</sup>  
</body>  
</html>  

  • Затем HTML-строка преобразуется в NSAttributedString с помощью следующего сценария.

private func convertHTMLToAttributedString(string: String) -> NSAttributedString {  
       guard let data = string.data(using: String.Encoding.utf16, allowLossyConversion: false) else { return NSAttributedString() }  
       return try! NSAttributedString(  
           data: data,  
           options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],  
           documentAttributes: nil)  
   } 

  • Затем NSAttributedString будет отображаться через UILabel.attributedText. Это описание attribuText:

1,2,3,8,9{  
   NSColor = "kCGColorSpaceModelRGB 0.333333 0.262745 0.266667 1 ";  
   NSFont = "<UICTFont: 0x7fed0a469880> font-family: \"MyCustomFont\"; font-weight: normal; font-style: normal; font-size: 10.00pt";  
   NSKern = 0;  
   NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 13/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";  
   NSStrokeColor = "kCGColorSpaceModelRGB 0.333333 0.262745 0.266667 1 ";  
   NSStrokeWidth = 0;  
   NSSuperScript = 1;  
}

Примечание. Я думал, что проблема связана с нашим пользовательским шрифтом, но проблема все еще возникает, когда мы используем шрифт по умолчанию.

Эта проблема связана со Swift 3.1 и должна быть исправлена?

1 ответ

Мы обнаружили, что проблема связана с рендерингом текста UILabel в iOS 10.3, а не в Swift 3.1. Затронутый стиль зачеркивания для нас.

Для нашего конкретного сценария (у нас есть все атрибуты, указанные в NSAttributedString, не используя свойства UILabel) это решение:

/// 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)
        }
    }
}
Другие вопросы по тегам