iPhone / iPad的:如何使用NSAttributedString?

是的,很多人都在谈论iPhone / iPad中的Rich Text,并且很多人都知道NSAttributedString

但是如何使用NSAttributedString ? 我search了很多时间,没有提取这方面的线索。

我知道如何设置一个NSAttributedString ,那么我应该怎么做才能在iPhone / iPad上显示带有丰富文本的文本?

官方文档说应该使用CoreText.Framework ,这是什么意思?

有没有这样简单的方法?

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

你应该看看AliSoftware的OHAttributedLabel 。 它是UILabel的一个子类,它绘制了一个NSAttributedString,并提供了从UIKit类设置NSAttributedString属性的简便方法。

从回购中提供的样本:

 #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. 

注意:在iOS 6+中,您可以使用UILabel的属性文字属性呈现属性string。

从iOS 6.0开始,你可以这样做:

 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; 

你应该尝试TTTAttributedLabel 。 这是UILabel的一个替代品,可以与NSAttributedString一起使用,并且对于UITableViewCells来说已经足够了。

有没有简单的方法

NSAttributedString * str;

UILabel *标签;

label.attributedString = str;

几乎。 只需使用CATextLayer。 它有一个可以设置为NSAttributedString的string属性。

编辑(2012年11月):当然这一切已经改变了iOS 6。在iOS 6中,你可以做OP什么要求 – 直接分配一个标签的attributedTextstring归属string。

回答iOS 6的UILabel归因文本alignment问题:使用NSMutableAttributedString并将NSMutableParagraphStyle添加到属性中。 像这样的东西:

 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; 

我认为这是有用的解释一个(简化)的HTMLstring,以创build一个NSAttributedString的例子。

这是不完整的 – 它只处理<b>和<i>标签,对于初学者来说,并不打扰任何error handling – 但也希望也是一个有用的例子,如何开始使用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://stackoverflow.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
@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://stackoverflow.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 

要使用,做这样的事情:

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

从iOS 6.0开始,你可以这样做:另一个示例代码。

 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; 

对于Swift使用这个,

这将使Titl文字大胆,

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

我知道这有点迟,但对其他人来说,

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

将所需的属性添加到字典并将其作为属性parameter passing