objective c - superindices - ¿Cómo hacer subíndices y superíndices usando NSAttributedString?
superindice html (5)
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];
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?
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 fuentes 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;
}
Esto es lo que hice en iOS 6. Primero agregue los marcos CoreText y QuartzCore. Luego importa:
#import <QuartzCore/QuartzCore.h>
#import <CoreText/CTStringAttributes.h>
#import <CoreText/CoreText.h>
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í!
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];
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
.