iOS-UILabel充分利用NSAttributedString
1、同一塊文字中設定不同字型、顏色,及換行
程式碼如下:
- (void)viewDidLoad {
[super viewDidLoad];
NSString *text = @"百家姓:\n趙錢孫李,周吳鄭王。\n馮陳褚衛,蔣沈韓楊。\n朱秦尤許,何呂施張。\n孔曹嚴華,金魏陶姜。\n戚謝鄒喻,柏水竇章。\n雲蘇潘葛,奚範彭郎。\n魯韋昌馬,苗鳳花方。\n俞任袁柳,酆鮑史唐。\n費廉岑薛,雷賀倪湯。\n滕殷羅畢,郝鄔安常。";
CGFloat labelHeight = [self heightOfLabelWithText:text font:[UIFont systemFontOfSize:12.0] width:self.view.frame.size.width-20];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, self.view.frame.size.width-20, labelHeight)];
label.font = [UIFont systemFontOfSize:12.0];
label.textColor = [UIColor darkGrayColor];
label.attributedText = [self configLabelTextWithText:text label:label boundaryLength:4];
[self.view addSubview:label];
}
#pragma mark - 計算高度
- (CGFloat)heightOfLabelWithText:(NSString *)text font:(UIFont *)font width:(CGFloat)width{
UILabel *testLabel = [[UILabel alloc] init];
testLabel.font = font;
CGRect oldFrame = testLabel.frame;
oldFrame.size.width = width;
[testLabel setFrame:oldFrame];
testLabel.attributedText = [self configLabelTextWithText:text label:testLabel boundaryLength:4];
[testLabel sizeToFit];
return testLabel.frame.size.height;
}
#pragma mark - 設定具體文字屬性
- (NSAttributedString *)configLabelTextWithText:(NSString *)labelText label:(UILabel *)label boundaryLength:(NSInteger)boundaryLenght{
NSString *text = labelText; //[NSString stringWithFormat:@"%@",[labelText stringByReplacingOccurrencesOfString:@"\\n" withString:@"\r\n" ]];
label.numberOfLines = 0;
NSMutableAttributedString * attributedText = [[NSMutableAttributedString alloc] initWithString:text];
[attributedText setAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14.0], NSForegroundColorAttributeName:[[UIColor orangeColor] colorWithAlphaComponent:0.5]} range:NSMakeRange(0, boundaryLenght)];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:(8.0-(label.font.lineHeight - label.font.pointSize))];
[paragraphStyle setLineBreakMode:label.lineBreakMode];
[paragraphStyle setAlignment:label.textAlignment];
[attributedText addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, text.length)];
return attributedText;
}
程式碼實現效果:
2、文字中新增圖片
只修改configLabelTextWithText
方法,程式碼如下:
- (NSAttributedString *)configLabelTextWithText:(NSString *)labelText label:(UILabel *)label boundaryLength:(NSInteger)boundaryLenght{
NSString *text = labelText; // [NSString stringWithFormat:@"%@",[labelText stringByReplacingOccurrencesOfString:@"\\n" withString:@"\r\n" ]];
label.numberOfLines = 0;
NSMutableAttributedString * attributedText = [[NSMutableAttributedString alloc] initWithString:text];
[attributedText setAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14.0],NSForegroundColorAttributeName:[[UIColor orangeColor] colorWithAlphaComponent:0.5]} range:NSMakeRange(0, boundaryLenght)];
//建立NSTextAttachment
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [UIImage imageNamed:@"NaturePatterns02.jpg"];
attachment.bounds = CGRectMake(0, (label.font.capHeight-10)/2.0, 16, 10);
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:(8.0-(label.font.lineHeight - label.font.pointSize))];
[paragraphStyle setLineBreakMode:label.lineBreakMode];
[paragraphStyle setAlignment:label.textAlignment];
[attributedText addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [text length])];
NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment];
[attributedText insertAttributedString:attachmentString atIndex:boundaryLenght+4];
[attributedText insertAttributedString:attachmentString atIndex:text.length-20];
return attributedText;
}
程式碼執行效果:
3、部分程式碼解釋:
-
1> NSTextAttachment-bounds屬性
label新增圖片中,attachment.bounds
屬性,寬高不用多說,至於縱座標y值,如果設定為0,圖片不一定會和文字對齊,會有一定的偏移,那麼如何設定y值呢?
請點選這裡檢視答案
你會看到有個人這麼說:
沒錯就是採用:(label.font.capHeight-image.size.height)/2.0
2> NSMutableParagraphStyle-lineSpacing屬性
lineSpacing屬性要想符合UI的要求請參考我之前的文章->iOS-文字行高
-
3> 具體細節參考
原博主文章-UILabel&UITextView文字嵌入圖片處理
相關文章
- iOS (CoreText框架) NSAttributedStringiOS框架
- HTML標籤 轉 NSAttributedStringHTML
- iOS 富文字常用封裝(NSAttributedString淺析)iOS封裝
- webpack 拾翠:充分利用 CommonsChunkPlugin()WebPlugin
- [譯] 如何充分利用 JavaScript 控制檯JavaScript
- [譯] 充分利用多攝像頭 APIAPI
- 如何充分利用你的會話工具會話
- MySQL如何充分利用系統資源?MySql
- 專案管理中如何充分利用子任務專案管理
- 如何充分利用Apple的macOS預覽應用APPMac
- 充分利用Windows API擴充套件Delphi函式 (轉)WindowsAPI套件函式
- 充分利用系統的組策略保障共享目錄安全
- Liunx皮膚如何設定能充分利用伺服器效能伺服器
- 如何充分利用電話機器人為我們帶來利益?機器人
- 日誌分析兩部曲:充分利用日誌保護網路
- [譯] 如何在 Android 開發中充分利用多攝像頭 APIAndroidAPI
- 如何藉助Linux充分利用舊PC建立伺服器環境Linux伺服器
- (轉)面向Web 2.0的儲存引擎設想:充分利用資料訪問扭曲Web儲存引擎
- 人們沒有充分利用人工智慧來發揮人類的潛力人工智慧
- 程式設計師必看:如何充分利用程式碼審查提升你的程式碼質量?程式設計師
- Oracle資料檔案自動擴充套件會充分利用最後剩餘空間Oracle套件
- 使用.NET並行任務庫(TPL)與並行Linq(PLINQ)充分利用多核效能並行
- Android 相容性 | 充分利用新款 Android 旗艦裝置上更大的縱橫比Android
- 如何讓語言模型充分利用GPU:針對大規模並行裝置的N-gram模型GPU並行
- 遼寧:嚴厲打擊違法違規行為,充分利用大資料手段規範招標投標市場大資料
- L2 Think Tank:調查顯示不少國際酒店品牌並未充分利用社交媒體工具來觸及中國旅行者
- 【業務自動化平臺】上海道寧與UiPath致力於讓每個企業、每個人都能充分利用自動化帶來的成就和優勢UI
- Material Design 實戰 之 第六彈 —— 可摺疊式標題欄(CollapsingToolbarLayout) & 系統差異型的功能實現(充分利用系統狀態列空間)...Material Design