1

Die Anwendung, an der ich arbeite, hat beim Testen mit iOS 10.3 Simulator über XCode 8.3 Beta 2 ein Problem festgestellt, wobei der hochgestellte String in AttributedString in derselben Zeile mit normalem Text angezeigt wird. Für iOS 10.2.x und darunter wird es korrekt angezeigt.Swift 3.1 - NSSuperScript in NSAttributedString funktioniert nicht wie erwartet

iOS 10.3 Screenshot: https://www.dropbox.com/s/p5v71g722cg5qhy/Screen%20Shot%202017-02-21%20at%2010.24.21%20AM.png?dl=0

iOS 10.2.x und unten Screenshot: https://www.dropbox.com/s/lcfsic6xyz953qp/Screen%20Shot%202017-02-21%20at%2010.19.17%20AM.png?dl=0

Hier ist, wie ich den Text behandelt:

  • zunächst die Zeichenfolge im HTML-Format, und Marke für den Text "8,9" über

<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>

  • Die HTML-String dann in NSAttributedString mit dem folgenden Skript

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

  • Die NSAttributedString wird dann vi gemacht werden ein UILabel.attributedText Dies ist die attributedText Beschreibung:

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

Hinweis: Ich dachte, das Problem auf unsere eigene Schriftart verwandt war, aber das Problem immer noch passieren, wenn wir die Standardschriftart verwenden .

Ist dies ein Problem mit Swift 3.1 und sollte behoben werden?

+0

I (scheint 'NSSuperScript' keine Wirkung zu haben) hat vor kurzem die gleiche Wirkung entdeckt innerhalb eine Mac OS App. – ixany

Antwort

1

Wir fanden, dass es ein Problem in UILabel zugeschriebenen Text Rendering in iOS 10.3, nicht Swift 3.1-bezogen ist. Betroffener Durchschlagstil für uns.

Für unser spezielles Szenario (wir haben alle Attribute in NSAttributedString angegeben, nicht UILabel Eigenschaften verwendet wird) ist dies die Lösung:

/// 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) 
     } 
    } 
} 
+0

Obwohl mein Label nur die Eigenschaft 'text' gesetzt hat, ist 'attributedText' nicht gleich Null (es enthält denselben String, plus Attribute für' NSColor', 'NSFont' und' NSParagraphStyle'). Daher gibt die Guard-Anweisung im obigen Code immer wahr zurück. – Koen

+0

@Koen es ist nicht garantiert, nicht non-nil obwohl. Wer weiß, was sie in der nachfolgenden iOS-Version ändern oder ob es nicht vor iOS 10 nicht nichtig war. – rshev

+0

Ja, guter Punkt. Immer noch interessant, warum 'attributedText' gesetzt wird, wenn nur' text' gesetzt ist. Aber das ist außerhalb des Rahmens dieser Frage. – Koen

Verwandte Themen