Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体

195
votes
answers
楼主
62 views
+10

iphone / ipad:究竟如何使用NSAttributedString?

是的,很多人都在談論iPhone / iPad中的Rich Text,很多人都知道 NSAttributedString

但是如何使用 NSAttributedString 我搜索了很多時間,沒有提取線索。

我知道如何設置 NSAttributedString ,那麼我應該怎樣做才能在iPhone / iPad上顯示豐富的文字文本?

官方文檔說它應該與 CoreText.Framework 一起使用,這是什麼意思?

有這樣簡單的方法嗎?< / p>

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

好吧,最後我使用Three20 - 傑克2010年10月25日在17:09

上面的答案是正確的。像這樣的代碼,並確保您將CoreText框架添加到鏈接的框架。 - mxcl 2010年10月26日12:07

謝謝,我給Wes留下了正確答案 - 傑克2010年10月27日9:53

Three20是垃圾。 - bandejapaisa 12年12月12日0:10

多數民眾贊成,但我認為這不是更糟糕的事情。在過去的6個月裡,我一直在維護一個使用Three20的項目...他們用記憶做的一些事情讓我感到困惑。代碼非常脆弱,因為它不能以正統的方式處理內存。做他們自己提供的東西要好得多。你不太可能需要他們提供的一切。自己做吧......你會學到更多,更有趣,你可能會做得更好! - bandejapaisa 12年12月2日21:50

沙发
+1540

從iOS 6.0開始,您可以這樣做:

  NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@“Hello。這是一個測試歸因字符串。”]; [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;  
     
			
        

很好,簡單的回答,謝謝!:) - Jarrod '12年10月31日6:45

此外,如果您發現自己編寫了很多屬性字符串,請查看此帖子/類別。使創作更容易一些。raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers - Alex Rouse 2014年3月12日21:54

板凳
+150

您應該嘗試 TTTAttributedLabel 它是UILabel的替代品,可與NSAttributedString一起使用,並且對UITableViewCells具有足夠的性能。

這個類可以在下面提到的Three20庫中找到。 - 大衛H 2011年7月12日16:06

不,這不是來自three20(注意3 Ts) - vikingosegundo 2011年7月27日0:23

地板
+60

是否有任何簡單的方法,如

NSAttributedString * str;

UILabel * label;

label.attributedString = str;

差不多。只需使用CATextLayer即可。它有一個 string 屬性,您可以將其設置為NSAttributedString。

EDIT(2012年11月):當然,iOS 6中的所有這些都已更改。在iOS 6中,您可以完全按照OP要求進行操作 - 將屬性字符串直接分配給標籤的 attributedText

您可以更具體一點,例如提供示例用法嗎? - William Niu 12年4月24日5:22

是的,它被稱為我的書,編程iOS 5.這是本書中的代碼示例:github.com/mattneub/Programming-iOS-Book-Examples/blob/master / ... - matt 12年12月24日18:22 )

4楼
+60

在iOS 6上回答UILabel屬性文本對齊:使用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]; [attributionStr addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:strRange]; myUILabel.attributedText = attributedStr;  
     
			
        
5楼
+60

我認為提供一個解析(簡化)HTML字符串的示例來創建NSAttributedString會很有用。

它不完整 - 它只處理&lt; b&gt; 和&lt; i&gt; 標籤,對於初學者,並且不打擾任何錯誤處理 - 但希望也是如何開始使用NSXMLParserDelegate ...

  @interface ExampleHTMLStringToAttributedString:NSObject&lt; NSXMLParserDelegate&gt; +(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]; 回歸自我 }  - (NSAttributedString *)getAttributedStringWithFontSize:(CGFloat)fontSize {mfFontSize = fontSize; //解析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&amp;&amp; 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委託 - (void)parserDidStartDocument:(NSXMLParser *)解析器{appendThisString = [NSMutableString new]; mbIsBold = NO; mbIsItalic = NO;  - (void)解析器:(NSXMLParser *)解析器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)解析器:(NSXMLParser *)解析器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)解析器:(NSXMLParser *)解析器parseErrorOccurred:(NSError *)parseError {} @end   

要使用,請執行以下操作:

 < code> self.myTextView.attributedText = [ExampleHTMLStringToAttributedString getAttributedStringForHTMLText:@“這是&lt; b&gt; bold&lt; / b&gt; text”WithFontSize:self.myTextView.pointSize];   (NSError *)parseError {} @end   

要使用,請執行以下操作:

  self.myTextView.attributedText = [ExampleHTMLStringToAttributedString getAttributedStringForHTMLText:@“這是&lt; b&gt;粗體&lt; / b&gt;文本“WithFontSize:self.myTextView.pointSize];   (NSError *)parseError {} @end   

要使用,請執行以下操作:

  self.myTextView.attributedText = [ExampleHTMLStringToAttributedString getAttributedStringForHTMLText:@“這是&lt; b&gt;粗體&lt; / b&gt;文本“WithFontSize:self.myTextView.pointSize];  
     
			
        
6楼
+50

從iOS 6.0開始,您可以這樣做:另一個示例代碼。

  NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@“這是我的測試代碼,用於測試此標籤樣式是否有效,文本上顯示其他用戶”]; [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;  
     
			
        

真的很棒 - Rajesh Loganathan 2014年7月9日13:04

7楼
+20

Swift 使用它,

它會使 Titl 文本變為粗體,

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

在類似的問題上我發布了這個答案:stackoverflow.com/questions/12569316 / ...它有助於解釋如何使用退出(放鬆)功能 - 埃里克11月18日在3:03

8楼
+10

我知道它有點晚了,但它會對其他人有用,

  NSMutableAttributedString * attrStr = [[NSMutableAttributedString alloc] initWithString:@“string”屬性:@ {NSForegroundColorAttributeName: [UIColor blackColor]}]; [self.label setAttributedText:newString];   

將所需屬性添加到字典中並將其作為屬性參數傳遞

discard