swift3 - Swift 3.1-NSSuperScript en NSAttributedString no funciona como se esperaba
xcode8-beta6 ios10.3 (1)
La aplicación en la que estoy trabajando encontró un problema al probar con iOS 10.3 Simulator a través de XCode 8.3 beta 2, donde el superíndice en AttributedString se muestra en la misma línea con el texto normal. Para iOS 10.2.xy siguientes, se muestra correctamente.
Captura de pantalla de iOS 10.3: https://www.dropbox.com/s/p5v71g722cg5qhy/Screen%20Shot%202017-02-21%20at%2010.24.21%20AM.png?dl=0
Captura de pantalla de iOS 10.2.x e inferior: https://www.dropbox.com/s/lcfsic6xyz953qp/Screen%20Shot%202017-02-21%20at%2010.19.17%20AM.png?dl=0
Así es como manejé el texto:
- Inicialmente, la cadena está en formato HTML y etiqueta para el texto "8,9" arriba
<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>
- La cadena html luego se convirtió a NSAttributedString usando la siguiente secuencia de comandos
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)
}
- El NSAttributedString luego se representará a través de UILabel.attributedText Esta es la descripción de attributeText:
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;
}
Nota: pensé que el problema estaba relacionado con nuestra fuente personalizada, pero el problema aún ocurre cuando usamos la fuente predeterminada.
¿Se trata de un problema relacionado con Swift 3.1 y debe corregirse?
Descubrimos que es un problema en el procesamiento de texto atribuido de UILabel en iOS 10.3, no relacionado con Swift 3.1. Estilo de paso afectado para nosotros.
Para nuestro escenario específico (tenemos todos los atributos especificados en NSAttributedString
, sin usar las propiedades de UILabel) esta es la solución:
/// 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)
}
}
}