標籤:
本文轉載至 http://www.mobile-open.com/2015/86578.html
TYAttributedLabel 簡單,強大的屬性文本的控制項(無需瞭解CoreText),支援圖文混排顯示,支援添加連結,image和UIView控制項,支援自訂排版顯示
更新:
v2.4 修複imge放大bug,新增imageAlignment 和 autolayout支援,以及相應的demo,感謝xinzhengzhang,nonstriater
v2.3 新增 做題demo,代碼最佳化(4s真機測試tableview列表非常流暢)
v2.2 新增 TYImagecache類,新增 image URL 下載快取,功能最佳化,改進
v2.1 添加 tableViewCell demo, cell 滾動非常流暢
v2.0 重構最佳化代碼,效能提升,穩定(已在項目中使用), 分離出TYTextContainer ,可以提前產生,也可以產生attributedString,顯著提升cell滑動情境流暢度,可以和微博一樣流暢
v1.2 添加設定行數,修複bug,增強穩定性
v1.1 添加連結高亮效果,連結便利方法,長按手勢代理,最佳化代碼
ScreenShot
新-做題demo
weibo demo 使用TYAttributedLabel
Requirements
- Xcode 5 or higher
- Apple LLVM compiler
- iOS 6.0 or higher
- ARC
Features
- 支援富文本,圖文混排顯示,支援行間距 字間距,設定行數,自適應高度
- 支援添加高度自訂文字屬性
- 支援添加屬性文本,自訂連結,新增高亮效果顯示(文字和背景)
- 支援添加UIImage和UIView控制項
Demo
運行demo可以查看效果,而且在demo中,針對各種文本和圖文的實現都有詳細的用例,每個標頭檔中都有詳細的用法注釋,這裡簡單的介紹下用法
UsageAPI Quickstart
| Class |
Function |
| NSMutableAttributedString (TY) |
category提供便利color,font CharacterSpacing,UnderlineStyle,ParagraphStyle的屬性添加,無需瞭解複雜的CoreText |
| TYTextStorageProtocol |
自訂文字屬性 遵守最基本的協議 即可 addTextStorage 添加進去 |
| TYAppendTextStorageProtocol |
自訂文字屬性協議 遵守即可appendTextStorage 添加進去 |
| TYLinkStorageProtocol |
自訂文本連結屬性 繼承TYAppendTextStorageProtocol |
| TYDrawStorageProtocol |
自訂顯示內容協議 如 UIImage UIView |
下層協議繼承上層的協議,如果覺得複雜,其實我已經實現了常用的自訂屬性,拿來就可以用,或者繼承,添加你想要的
| Class |
Function |
| TYAttributedLabel |
簡單易用的屬性文本,富文本的顯示控制項, addTextStorage在已經設定文本的基礎上添加屬性,image或者view, appendTextStorage(無需事先設定文本)直接添加屬性,image或者view到最後 |
| TYTextContainer |
文本容器,可以提前產生,也可以產生attributedString,顯著提升cell滾動流暢度 |
| TYTextStorage |
自訂文字屬性,支援textColor,font,underLineStyle |
| TYLinkTextStorage |
自訂連結屬性,繼承TYTextStorage,支援點擊代理 |
| TYDrawStorage |
自訂顯示內容屬性,如UIImage,UIView,支援點擊代理 |
| TYImageStorage |
自訂圖片顯示,繼承TYDrawStorage |
| TYViewStorage |
自訂UIView控制項,繼承TYDrawStorage |
| TYImageCache |
image緩衝類,支援URL請求 |
如果需要更加詳細的內容,請看各個標頭檔,有詳細的注釋
Delegate
1 |
<span style="font-size: medium;">// 點擊代理 |
2 |
- (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageClicked:(id<TYTextStorageProtocol>)textStorage atPoint:(CGPoint)point; |
4 |
// 長按代理 有多個狀態 begin, changes, end 都會調用,所以需要判斷狀態 |
5 |
- (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageLongPressed:(id<TYTextStorageProtocol>)textStorage onState:(UIGestureRecognizerState)state atPoint:(CGPoint)point;</span> |
Examples
1 |
<span style="font-size: medium;">TYAttributedLabel *label = [[TYAttributedLabel alloc]init]; |
2 |
[self.view addSubview:label]; |
5 |
label.characterSpacing = 2; |
7 |
label.linesSpacing = 6; |
9 |
NSString *text = @"/t總有一天你將破蛹而出,成長得比人們期待的還要美麗。/n"; |
10 |
[label appendText:text]; |
12 |
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:text]; |
13 |
[attributedString addAttributeTextColor:[UIColor blueColor]]; |
14 |
[attributedString addAttributeFont:[UIFont systemFontOfSize:15]]; |
15 |
[label appendTextAttributedString:attributedString]; |
17 |
[label appendImageWithName:@"CYLoLi" size:CGSizeMake(CGRectGetWidth(label.frame), 180)]; |
19 |
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]]; |
20 |
imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180); |
21 |
[label appendView:imageView]; |
23 |
[label setFrameWithOrign:CGPointMake(0,0) Width:CGRectGetWidth(self.view.frame)];</span> |
addStorage demo
1 |
<span style="font-size: medium;">TYAttributedLabel *label = [[TYAttributedLabel alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 0)]; |
2 |
[self.view addSubview:label]; |
4 |
NSString *text = @"/t總有一天你將破蛹而出,成長得比人們期待的還要美麗。/n"; |
8 |
label.characterSpacing = 2; |
10 |
label.linesSpacing = 6; |
12 |
textStorage = [[TYTextStorage alloc]init]; |
14 |
textStorage.textColor = RGB(0, 155, 0, 1); |
15 |
textStorage.font = [UIFont systemFontOfSize:18]; |
16 |
[label addTextStorage:textStorage]; |
18 |
[label addLinkWithLinkData:@"www.baidu.com" range:NSMakeRange(5, 8)]; |
20 |
[label addImageWithName:@"haha" range:NSMakeRange(2, 1)]; |
22 |
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]]; |
23 |
imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180); |
24 |
[label addView:imageView range:NSMakeRange(16, 1)]; |
26 |
[label sizeToFit];</span> |
查看原始碼 列印協助
1 |
<span style="font-size: medium;">NSString *text = @"/t總有一天你將破蛹而出,成長得比人們期待的還要美麗。/n"; |
2 |
TYTextContainer *textContainer = [[TYTextContainer alloc]init]; |
3 |
textContainer.text = text; |
5 |
textContainer.characterSpacing = 2; |
7 |
textContainer.linesSpacing = 5; |
9 |
textStorage = [[TYTextStorage alloc]init]; |
11 |
textStorage.textColor = RGB(0, 155, 0, 1); |
12 |
textStorage.font = [UIFont systemFontOfSize:18]; |
13 |
[textContainer addTextStorage:textStorage]; |
15 |
[textContainer addLinkWithLinkData:@"www.baidu.com" range:NSMakeRange(5, 8)]; |
17 |
[textContainer addImageWithName:@"haha" range:NSMakeRange(2, 1)]; |
19 |
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]]; |
20 |
imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180); |
21 |
[textContainer addView:imageView range:NSMakeRange(16, 1)]; |
23 |
// 產生 textContainer 文本容器 |
24 |
[textContainer createTextContainerWithTextWidth:CGRectGetWidth(self.view.frame)]; |
26 |
TYAttributedLabel *label = [[TYAttributedLabel alloc]init]; |
27 |
label.textContainer = textContainer; |
29 |
// 也可以 產生NSAttributedString 屬性文本 |
30 |
//NSAttributedString *attString = [textContainer createAttributedString]; |
31 |
//label.attributedText = attString; |
33 |
[label setFrameWithOrign:CGPointZero Width:CGRectGetWidth(self.view.frame)]; |
34 |
[self.view addSubView:label];</span> |
TYAttributedLabel——簡單,強大的iOS屬性文本控制項