2011-12-18 19 views

Respuesta

28

Esto es posible de hacer 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). Debería dibujar el texto utilizando Texto principal o buscar un reemplazo de terceros para UILabel que pueda dibujar un NSAttributedString.

+0

Thanks. ¿Puedes usar kCTSuperscriptAttributeName para hacer superíndices también? – Mahir

+1

Sí, como dije, un valor positivo es para superíndices. Un valor negativo para los subíndices. –

+0

Lo siento, no sé cómo me lo perdí. Gracias de nuevo. – Mahir

33

Esto es lo que hice en iOS 6. Primero agregue los marcos CoreText y QuartzCore. A continuación, la importación:

#import <QuartzCore/QuartzCore.h> 
#import <CoreText/CTStringAttributes.h> 
#import <CoreText/CoreText.h> 

me hizo una pequeña función que introduce una NSString simple y exporta una NSMutableAttributedString con el último carácter de 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 me puede hacer lo siguiente para ponerlo en un UITextField:

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

espero que esto ayude a alguien más, no hay muchos ejemplos por ahí!

+0

Puede echar un vistazo a esta parte de la attributeString: https://gist.github.com/mladjan/6663691 No desea representar el superíndice :( – dormitkon

+3

No debe que los parámetros NSMakeRange sean firstPosition y length (en su lugar) de firstPosition y lastPosition). En el ejemplo, el lector puede estar confundido. – dwbrito

+0

cómo puedo eliminarlo –

0

también puede hacer lo siguiente si quiere que sea un limpiador Litle

NSDictionary *attr = @{ NSFontAttributeName: smallfont, 
         (NSString*)kCTSuperscriptAttributeName: @1 } 

NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);     
[subKeyString setAttributes:attr range:fabricWeightRange]; 
5

En iOS, me había perdido la kCTSuperscriptAttributeName constante pero tuvo buenos resultados con tamaño de fuente y "línea de base". Se le da un poco más de control también para las 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; 
}  
+0

Muchas gracias @hari – Ramdy

+0

¿Qué es 'Styles' aquí? –

+0

@AadilKeshwani Sólo una clase estática para centralizar fuentes, tamaños, colores y otros estilos relacionados con la aplicación. –

0

Por valor de uso para el subíndice kCTSuperscriptAttributeName como @ -1.

De acuerdo con el documento

@discussion El valor debe ser un CFNumberRef. El valor predeterminado es int value 0. Si admite 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]; 
+0

@Bhargav Rao. Es rápido, por eso escribí esta respuesta. –

Cuestiones relacionadas