¿Cómo hacer subíndices y superíndices usando NSAttributedString?

Necesito hacer subíndices para fórmulas químicas (H2O, Na ^ 2 +, etc.)?

¿Esto es posible con NSAttributedString, o hay una forma alternativa / más fácil de hacer subíndices?

Esto es posible con NSAttributedString . La constante de atributo que está buscando depende de su plataforma. Para Mac OS X es NSSuperscriptAttributeName y en iOS es kCTSuperscriptAttributeName . Pase un valor negativo para el subíndice.

La única advertencia es que UILabel en iOS no puede dibujar NSAttributedString s (aún, dedos cruzados para iOS 6). Tendría que dibujar el texto usando Core Text o encontrar un reemplazo de terceros para UILabel que pueda dibujar un NSAttributedString .

Esto es lo que hice en iOS 6. Primero agregue los marcos CoreText y QuartzCore. Luego importa:

 #import  #import  #import  

Hice una pequeña función que ingresa un NSString simple y exporta un NSMutableAttributedString con el último carácter en superíndice. Esto se puede modificar para permitir la configuración de superíndices o subíndices, cambiar el valor de kCTSuperscriptAttributeName a -1. También podría agregar una variable para especificar dónde colocar el superíndice en la cadena. En este momento solo asume el final de la cadena.

 - (NSMutableAttributedString *)plainStringToAttributedUnits:(NSString *)string; { NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string]; UIFont *font = [UIFont systemFontOfSize:10.0f]; UIFont *smallFont = [UIFont systemFontOfSize:9.0f]; [attString beginEditing]; [attString addAttribute:NSFontAttributeName value:(font) range:NSMakeRange(0, string.length - 2)]; [attString addAttribute:NSFontAttributeName value:(smallFont) range:NSMakeRange(string.length - 1, 1)]; [attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:NSMakeRange(string.length - 1, 1)]; [attString addAttribute:(NSString*)kCTForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, string.length - 1)]; [attString endEditing]; return attString; } 

Ahora cuando quiero usarlo, puedo hacer lo siguiente para ponerlo en un UITextField:

  NSString *qlwUnitsPlainText = @"m3"; self.quantityLoadWeightUnits_textField.attributedText = [self plainStringToAttributedUnits:qlwUnitsPlainText]; 

Espero que esto ayude a otra persona, ¡no hay muchos ejemplos por ahí!

En iOS, había omitido la constante kCTSuperscriptAttributeName, pero obtuve buenos resultados con el tamaño de fuente y la “línea base”. También te da un poco más de control para fonts menos obedientes:

 + (NSAttributedString *)attributedStringForText:(NSString *)normalText andSuperscript:(NSString *)superscriptText textSize:(CGFloat)textSize { UIFont *normalFont = [Styles mainFontWithSize:textSize]; UIFont *superFont = [Styles mainFontWithSize:textSize / 2]; NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc] initWithString:normalText attributes:@{NSFontAttributeName: normalFont}]; NSAttributedString *superStr = [[NSAttributedString alloc] initWithString:superscriptText attributes:@{NSFontAttributeName: superFont, NSBaselineOffsetAttributeName:@(textSize/2)}]; [finalStr appendAttributedString:superStr]; return finalStr; } 

también puedes hacer lo siguiente si quieres que sea un poco más limpio

 NSDictionary *attr = @{ NSFontAttributeName: smallfont, (NSString*)kCTSuperscriptAttributeName: @1 } NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1); [subKeyString setAttributes:attr range:fabricWeightRange]; 

Para el valor de uso de SubScript para kCTSuperscriptAttributeName como @ -1.

Según el documento

@discussion Value debe ser CFNumberRef. El valor predeterminado es int value 0. Si es compatible con la fuente especificada, un valor de 1 habilita el superíndice y un valor de -1 habilita la creación de subíndices.

extern const CFStringRef kCTSuperscriptAttributeName CT_AVAILABLE (10_5, 3_2);

  Example- [lblHeader setText:@“Headers [Alpha1 – text”]; NSMutableAttributedString *headerSubscript = [[NSMutableAttributedString alloc]initWithAttributedString: lblHeader.attributedText]; [headerSubscript addAttribute:(NSString *)kCTSuperscriptAttributeName value:@-1 range:NSMakeRange(14,1)]; [lblHeader setAttributedText:headerSubscript];