iphone ipad nsattributedstring

iphone - nsattributedstring swift 4



iphone/ipad: ¿Cómo se usa NSAttributedString exactamente? (9)

Sí, muchas personas dicen sobre el texto enriquecido en iPhone / iPad y muchos saben sobre NSAttributedString .

Pero, ¿cómo usar NSAttributedString ? Busqué mucho tiempo, sin extraer pistas para esto.

Sé cómo configurar un NSAttributedString , entonces ¿qué debo hacer para mostrar un texto en iPhone / iPad con texto enriquecido?

Los documentos oficiales dicen que debería usarse con CoreText.Framework , ¿qué significa eso?

¿Hay alguna manera simple como esta?

NSAttributedString *str; ..... UILabel *label; label.attributedString = str;


¿Hay alguna manera simple como

NSAttributedString * str;

Etiqueta UILabel *;

label.attributedString = str;

Casi. Solo use un CATextLayer. Tiene una propiedad de string que puede establecer en un NSAttributedString.

EDITAR (noviembre de 2012): Por supuesto, todo esto ha cambiado en iOS 6. En iOS 6, puede hacer exactamente lo que solicitó OP: asignar una cadena atribuida directamente al texto atribuido de una etiqueta.


A partir del iOS 6.0 puedes hacerlo así:

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Hello. That is a test attributed string."]; [str addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(3,5)]; [str addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(10,7)]; [str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:20.0] range:NSMakeRange(20, 10)]; label.attributedText = str;


A partir del iOS 6.0 puedes hacerlo así: otro código de muestra.

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"This is my test code to test this label style is working or not on the text to show other user"]; [str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,31)]; [str addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(61,10)]; [str addAttribute:NSFontAttributeName value: [UIFont fontWithName:@"Helvetica-Bold" size:13.0] range:NSMakeRange(32, 28)]; [str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica-Bold" size:13.0] range:NSMakeRange(65, 20)]; _textLabel.attributedText = str;


Debería echarle un vistazo a OHAttributedLabel de AliSoftware . Es una subclase de UILabel que dibuja un NSAttributedString y también proporciona métodos de conveniencia para establecer los atributos de un NSAttributedString de las clases de UIKit.

De la muestra provista en el repositorio:

#import "NSAttributedString+Attributes.h" #import "OHAttributedLabel.h" /**(1)** Build the NSAttributedString *******/ NSMutableAttributedString* attrStr = [NSMutableAttributedString attributedStringWithString:@"Hello World!"]; // for those calls we don''t specify a range so it affects the whole string [attrStr setFont:[UIFont systemFontOfSize:12]]; [attrStr setTextColor:[UIColor grayColor]]; // now we only change the color of "Hello" [attrStr setTextColor:[UIColor redColor] range:NSMakeRange(0,5)]; /**(2)** Affect the NSAttributedString to the OHAttributedLabel *******/ myAttributedLabel.attributedText = attrStr; // Use the "Justified" alignment myAttributedLabel.textAlignment = UITextAlignmentJustify; // "Hello World!" will be displayed in the label, justified, "Hello" in red and " World!" in gray.

Nota: en iOS 6+ puede representar cadenas atribuidas usando la propiedad attributedText de UILabel.


Deberías probar TTTAttributedLabel . Es un reemplazo directo para UILabel que funciona con NSAttributedString y es lo suficientemente eficiente para UITableViewCells.


Para Swift usa esto,

Hará que los textos de Titl sean audaces,

var title = NSMutableAttributedString(string: "Title Text") title.addAttributes([NSFontAttributeName: UIFont(name: "AvenirNext-Bold", size: iCurrentFontSize)!], range: NSMakeRange(0, 4)) label.attributedText = title


Pensé que sería útil dar un ejemplo de analizar una cadena HTML (simplificada) para crear una cadena NSAttributedString.

No está completo; solo maneja las etiquetas <b> y <i>, para empezar, y no se molesta en el manejo de errores, pero es de esperar que también sea un ejemplo útil de cómo comenzar con NSXMLParserDelegate ...

@interface ExampleHTMLStringToAttributedString : NSObject<NSXMLParserDelegate> +(NSAttributedString*) getAttributedStringForHTMLText:(NSString*)htmlText WithFontSize:(CGFloat)fontSize; @end @interface ExampleHTMLStringToAttributedString() @property NSString *mpString; @property NSMutableAttributedString *mpAttributedString; @property CGFloat mfFontSize; @property NSMutableString *appendThisString; @property BOOL mbIsBold; @property BOOL mbIsItalic; @end @implementation ExampleHTMLStringToAttributedString @synthesize mpString; @synthesize mfFontSize; @synthesize mpAttributedString; @synthesize appendThisString; @synthesize mbIsBold; @synthesize mbIsItalic; +(NSAttributedString*) getAttributedStringForHTMLText:(NSString*)htmlText WithFontSize:(CGFloat)fontSize { ExampleHTMLStringToAttributedString *me = [[ExampleHTMLStringToAttributedString alloc] initWithString:htmlText]; return [me getAttributedStringWithFontSize:fontSize]; } - (id)initWithString:(NSString*)inString { self = [super init]; if (self) { if ([inString hasPrefix:@""]) { mpString = inString; } else { mpString = [NSString stringWithFormat:@"%@", inString]; } mpAttributedString = [NSMutableAttributedString new]; } return self; } -(NSAttributedString*) getAttributedStringWithFontSize:(CGFloat)fontSize { mfFontSize = fontSize; // Parse the XML NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[mpString dataUsingEncoding:NSUTF8StringEncoding]]; parser.delegate = self; if (![parser parse]) { return nil; } return mpAttributedString; } -(void) appendTheAccumulatedText { UIFont *theFont = nil; if (mbIsBold && mbIsItalic) { // http://.com/questions/1384181/italic-bold-and-underlined-font-on-iphone theFont = [UIFont fontWithName:@"Helvetica-BoldOblique" size:mfFontSize]; } else if (mbIsBold) { theFont = [UIFont boldSystemFontOfSize:mfFontSize]; } else if (mbIsItalic) { theFont = [UIFont italicSystemFontOfSize:mfFontSize]; } else { theFont = [UIFont systemFontOfSize:mfFontSize]; } NSAttributedString *appendThisAttributedString = [[NSAttributedString alloc] initWithString:appendThisString attributes:@{NSFontAttributeName : theFont}]; [mpAttributedString appendAttributedString:appendThisAttributedString]; [appendThisString setString:@""]; } #pragma NSXMLParserDelegate delegate -(void)parserDidStartDocument:(NSXMLParser *)parser{ appendThisString = [NSMutableString new]; mbIsBold = NO; mbIsItalic = NO; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"body"]){ } else if ([elementName isEqualToString:@"i"]) { [self appendTheAccumulatedText]; mbIsItalic = YES; } else if ([elementName isEqualToString:@"b"]) { [self appendTheAccumulatedText]; mbIsBold = YES; } } -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"body"]){ [self appendTheAccumulatedText]; } else if ([elementName isEqualToString:@"i"]) { [self appendTheAccumulatedText]; mbIsItalic = NO; } else if ([elementName isEqualToString:@"b"]) { [self appendTheAccumulatedText]; mbIsBold = NO; } } -(void)parserDidEndDocument:(NSXMLParser *)parser{ } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { [appendThisString appendString:string]; } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { } @end

Para usar, haz algo como esto:

self.myTextView.attributedText = [ExampleHTMLStringToAttributedString getAttributedStringForHTMLText:@"this is <b>bold</b> text" WithFontSize:self.myTextView.pointSize];


Responda por la alineación de texto atribuida por UILabel en iOS 6: use NSMutableAttributedString y agregue NSMutableParagraphStyle al atributo. Algo como esto:

NSString *str = @"Hello World!"; NSRange strRange = NSMakeRange(0, str.length); NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:str]; NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init]; [paragrahStyle setAlignment:NSTextAlignmentCenter]; [attributedStr addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:strRange]; myUILabel.attributedText = attributedStr;


Sé que es un poco tarde, pero será útil para otros,

NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString:@"string" attributes:@{NSForegroundColorAttributeName:[UIColor blackColor]}]; [self.label setAttributedText:newString];

Agregue el atributo deseado al diccionario y páselo como un parámetro de atributos