TYAttributedLabel 2.6.9

TYAttributedLabel 2.6.9

测试已测试
语言语言 Obj-CObjective C
许可协议 MIT
发布最后发布2020年12月

tany 维护。



  • 作者:
  • tany

TYAttributedLabel v2.6

TYAttributedLabel 简单,强大的属性文本控件(无需了解 CoreText),支持图文混排显示,支持添加链接,图片和 UIView 控件,支持自定义排版显示

新的异步渲染 TYText:通过 TextKit 进行文本异步渲染

更新
详细的使用请看 LovePlayNews 项目
如果需要自动推断高度,请使用 autolayout 并设置 preferredMaxLayoutWidth
添加到 CocoaPods
微博 demo(建议真机调试)下载地址:链接: http://pan.baidu.com/s/1sjnBWRj 密码: t7qn
v2.6 新增宽度自适应 isWidthToFit,空心字设置 strokeWidth,段落间距 paragraphSpacing
v2.5 将 label的一些操作移动到 textContainer,label 只负责 draw。
v2.4 修复 imge 放大 bug,新增 imageAlignment 和 autolayout 支持,以及相应的 demo,感谢 xinzhengzhang,nonstriater
v2.3 新增 做题 demo,代码优化
v2.2 新增 TYImagecache 类,新增 image URL 下载缓存,功能优化,改进
v2.1 添加 tableViewCell demo
v2.0 重构优化代码,性能提升,稳定(已在项目中使用),分离出 TYTextContainer,可以提前生成,也可以生成 attributedString,显著提升 cell 滑动场景流畅度,可以和微博一样流畅
v1.2 添加设置行数,修复 bug,增强稳定性
v1.1 添加链接高亮效果,链接便利方法,长按手势代理,优化代码

CocoaPods

pod 'TYAttributedLabel', '~> 2.6.2'

屏幕截图

image

新 - 做题 demo

image

微博 demo 使用 TYAttributedLabel 截图

image

需求

  • Xcode 5或更高版本
  • Apple LLVM编译器
  • iOS 6.0或更高版本
  • ARC

特性

  • 支持属性文本、图文混排显示,支持行间距、段落间距,设置行数,自适应高度、宽度
  • 支持添加自定义文本属性
  • 支持添加属性文本,自定义链接,新增高亮效果显示(文字和背景)
  • 支持添加UIImage和UIView控件

示例

运行示例可以查看效果,同时在示例中,针对各种文本和图文的实现都有详细的用例,每个头文件中都有详细的用法注释,这里简单介绍一下用法

使用方法

API 快速上手

  • 分类和协议
函数
NSMutableAttributedString (TY) category提供便利属性color,font,CharacterSpacing,UnderlineStyle,ParagraphStyle的添加,无需了解复杂的CoreText
TYTextStorageProtocol 自定义文本属性 遵循最基本的协议即可addTextStorage添加进去
TYAppendTextStorageProtocol 自定义文本属性协议 遵循即可appendTextStorage添加进去
TYLinkStorageProtocol 自定义文本链接属性 继承TYAppendTextStorageProtocol
TYDrawStorageProtocol 自定义显示内容协议 如 UIImage, UIView

下层协议继承上层的协议,如果觉得复杂,其实我已经实现了常用的自定义属性,拿来就可以用,或者继承,添加你想要的

  • 标签和存储
函数
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请求

如果需要更详细的内容,请查看各个头文件,有详细的注释

委托

// 点击代理
- (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageClicked:(id<TYTextStorageProtocol>)textStorage atPoint:(CGPoint)point;

// 长按代理 有多个状态 begin, changes, end 都会调用,所以需要判断状态
- (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageLongPressed:(id<TYTextStorageProtocol>)textStorage onState:(UIGestureRecognizerState)state atPoint:(CGPoint)point;

示例

  • appendStorage 示例
TYAttributedLabel *label = [[TYAttributedLabel alloc]init];
[self.view addSubview:label];

// 文字间隙
label.characterSpacing = 2;
// 文本行间隙
label.linesSpacing = 6;

NSString *text = @"\t总有一天你将破蛹而出,成长得比人们期待的还要美丽。\n";
[label appendText:text];

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:text];
[attributedString addAttributeTextColor:[UIColor blueColor]];
[attributedString addAttributeFont:[UIFont systemFontOfSize:15]];
[label appendTextAttributedString:attributedString];

[label appendImageWithName:@"CYLoLi" size:CGSizeMake(CGRectGetWidth(label.frame), 180)];

UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]];
imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180);
[label appendView:imageView];

[label setFrameWithOrign:CGPointMake(0,0Width:CGRectGetWidth(self.view.frame)];
  • addStorage 示例
TYAttributedLabel *label = [[TYAttributedLabel alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 0)];
[self.view addSubview:label];

NSString *text = @"\t总有一天你将破蛹而出,成长得比人们期待的还要美丽。\n";
[label setText:text];

// 文字间隙
label.characterSpacing = 2;
// 文本行间隙
label.linesSpacing = 6;

textStorage = [[TYTextStorage alloc]init];
textStorage.range = [text rangeOfString:@"总有一天你将破蛹而出"]; 
textStorage.textColor = RGB(0, 155, 0, 1);
textStorage.font = [UIFont systemFontOfSize:18];
[label addTextStorage:textStorage];

[label addLinkWithLinkData:@"www.baidu.com" range:NSMakeRange(5, 8)];

[label addImageWithName:@"haha" range:NSMakeRange(2, 1)];

UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]];
imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180);
[label addView:imageView range:NSMakeRange(16, 1)];

[label sizeToFit];
  • TextContainer 示例
NSString *text = @"\t总有一天你将破蛹而出,成长得比人们期待的还要美丽。\n";
TYTextContainer *textContainer = [[TYTextContainer alloc]init];
    textContainer.text = text;
    // 文字间隙
textContainer.characterSpacing = 2;
// 文本行间隙
textContainer.linesSpacing = 5;

textStorage = [[TYTextStorage alloc]init];
textStorage.range = [text rangeOfString:@"总有一天你将破蛹而出"]; 
textStorage.textColor = RGB(0, 155, 0, 1);
textStorage.font = [UIFont systemFontOfSize:18];
[textContainer addTextStorage:textStorage];

[textContainer addLinkWithLinkData:@"www.baidu.com" range:NSMakeRange(5, 8)];

[textContainer addImageWithName:@"haha" range:NSMakeRange(2, 1)];

UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]];
imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180);
[textContainer addView:imageView range:NSMakeRange(16, 1)];


// 生成 textContainer 文本容器
[textContainer createTextContainerWithTextWidth:CGRectGetWidth(self.view.frame)];

TYAttributedLabel *label = [[TYAttributedLabel alloc]init];
label.textContainer = textContainer;


// 也可以 生成NSAttributedString 属性文本
//NSAttributedString *attString = [textContainer createAttributedString];
//label.attributedText = attString;

[label setFrameWithOrign:CGPointZero Width:CGRectGetWidth(self.view.frame)];
[self.view addSubView:label];

联系

如果你发现bug,请向我提出请求
如果你有更好的改进,请向我提出请求