2011-12-18 18 views

risposta

28

Ciò è possibile a che fare con NSAttributedString. La costante di attributo che stai cercando dipende dalla tua piattaforma. Per Mac OS X è NSSuperscriptAttributeName e su iOS è kCTSuperscriptAttributeName. Passa a un valore negativo per pedice.

L'unica avvertenza è che UILabel su iOS non può disegnare NSAttributedString s (ancora, incrociamo le dita per iOS 6). Dovresti disegnare il testo usando il Core Text o trovare qualche sostituto di terze parti per UILabel che può disegnare un NSAttributedString.

+0

Grazie. Puoi usare kCTSuperscriptAttributeName per creare anche gli apici? – Mahir

+1

Sì, come ho affermato, un valore positivo è per gli apici. Un valore negativo per i pedici. –

+0

Scusa, non so come mi sia mancato. Grazie ancora. – Mahir

33

Ecco quello che ho fatto in iOS 6. In primo luogo aggiungere il CoreText e quadri QuartzCore. Poi importazione:

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

ho fatto una piccola funzione che immette una pianura NSString ed esporta una NSMutableAttributedString con l'ultimo carattere in apice. Questo può essere modificato per consentire l'impostazione di apice o pedice, cambiare il valore di kCTSuperscriptAttributeName su -1. Inoltre è possibile aggiungere una variabile per specificare dove inserire l'apice nella stringa. In questo momento assume solo la fine della stringa.

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

Ora quando voglio usarlo posso effettuare le seguenti operazioni per metterlo in un UITextField:

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

Spero che questo aiuta qualcun altro, non ci sono molti esempi là fuori!

+0

Potete per favore dare un'occhiata a questa parte di attributoString: https://gist.github.com/mladjan/6663691 Non voglio rendere apice :( – dormitkon

+3

Non dovresti che i parametri NSMakeRange siano firstPosition e length (invece di firstPosition e lastPosition) Nell'esempio il lettore può essere fuorviante – dwbrito

+0

come posso rimuoverlo –

0

si può anche fare quanto segue se si vuole rendere un pulitore litle

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

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

Su iOS, avevo perso il kCTSuperscriptAttributeName costante ma ha avuto buoni risultati con la dimensione del carattere e "base". Ti dà un po 'più di controllo troppo per i font meno ubbidienti:

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

Grazie mille @hari – Ramdy

+0

cosa sono 'Stili' qui? –

+0

@AadilKeshwani Solo una classe statica per centralizzare caratteri, dimensioni, colori e altri stili relativi all'app. –

0

Per valore d'uso pedice per kCTSuperscriptAttributeName come @ -1.

Secondo il documento

@discussion valore deve essere un CFNumberRef. Predefinito è int valore 0. Se supportato dal carattere specificato, un valore 1 attiva pedici e un valore di -1 consente subscripting.

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 È rapido, ecco perché ho scritto questa risposta. –

Problemi correlati