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文字嵌入圖片處理
相關文章
- HTML標籤 轉 NSAttributedStringHTML
- iOS 富文字常用封裝(NSAttributedString淺析)iOS封裝
- [譯] 充分利用多攝像頭 APIAPI
- MySQL如何充分利用系統資源?MySql
- 如何充分利用你的會話工具會話
- 專案管理中如何充分利用子任務專案管理
- 如何充分利用Apple的macOS預覽應用APPMac
- 充分利用系統的組策略保障共享目錄安全
- Liunx皮膚如何設定能充分利用伺服器效能伺服器
- 如何藉助Linux充分利用舊PC建立伺服器環境Linux伺服器
- 如何充分利用電話機器人為我們帶來利益?機器人
- [譯] 如何在 Android 開發中充分利用多攝像頭 APIAndroidAPI
- 使用.NET並行任務庫(TPL)與並行Linq(PLINQ)充分利用多核效能並行
- 人們沒有充分利用人工智慧來發揮人類的潛力人工智慧
- 程式設計師必看:如何充分利用程式碼審查提升你的程式碼質量?程式設計師
- 如何讓語言模型充分利用GPU:針對大規模並行裝置的N-gram模型GPU並行
- 遼寧:嚴厲打擊違法違規行為,充分利用大資料手段規範招標投標市場大資料
- Material Design 實戰 之 第六彈 —— 可摺疊式標題欄(CollapsingToolbarLayout) & 系統差異型的功能實現(充分利用系統狀態列空間)...Material Design
- 【業務自動化平臺】上海道寧與UiPath致力於讓每個企業、每個人都能充分利用自動化帶來的成就和優勢UI