富文本是什么?
普通的文本展示就是label.text = @"xxxxxx",只能设置颜色、大小、背景色等等。
但是在实际开发中,我们需要用到图片/表情和文字的混合排版,那么就需要用到富文本了。
OC中提供了一个富文本类,NSAttributedString。有了他之后我们就可以用它来实现在UILabel、UIButton、UITextView上的图文混排效果,需要用到这些空间的attributedText属性。
在UILabel中
- (void)richText1
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 300, 40)];
[self.view addSubview:label];
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"爱上帝啊商店大的撒"];
//给指定范围的文字添加属性
//[string addAttributes:@{NSFontAttributeName:} range:<#(NSRange)#>]
//附件
NSTextAttachment *attach1 = [[NSTextAttachment alloc] init];
//调整图片位置
attach1.bounds = CGRectMake(0, 0, 20, 20);
//设置图片
attach1.image = [UIImage imageNamed:@"001"];
[string appendAttributedString:[NSAttributedString attributedStringWithAttachment:attach1]];
label.attributedText = string;
}
效果如图:
1.png
在UITextView中
在UITextView中还可以识别电话、网址、地址等等
#pragma mark - textView的富文本
- (void)richText2
{
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:@"fsaada http://www.baidu.com 10086 13888888888 dawa"];
//多行输入框
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 40, 300, 300)];
textView.backgroundColor = [UIColor lightGrayColor];
//禁用编辑
textView.editable = NO;
textView.delegate = self;
//启动自动识别电话号码或网址、邮箱
textView.dataDetectorTypes = UIDataDetectorTypeAll;
[self.view addSubview:textView];
//附件
NSTextAttachment *attach1 = [[NSTextAttachment alloc] init];
//调整图片位置
attach1.bounds = CGRectMake(0, 0, 20, 20);
//设置图片
attach1.image = [UIImage imageNamed:@"001"];
//添加图片
[attributeString appendAttributedString:[NSAttributedString attributedStringWithAttachment:attach1]];
//添加一个链接
NSString *url = @"进入百度";
NSMutableAttributedString *linkString = [[NSMutableAttributedString alloc] initWithString:url];
//添加属性
[linkString addAttribute:NSLinkAttributeName value:@"http://www.baidu.com" range:NSMakeRange(0, url.length)];
[attributeString appendAttributedString:linkString];
textView.attributedText = attributeString;
}
UITextView的代理方法
#pragma mark - UITextViewDelegate
//点击url会触发
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
{
//NSString *urlString = URL.absoluteString;
//可以跳转到浏览器
return YES;
}
//点击添加到输入框的NSTextAttachment对象会触发
- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange
{
//获取点击的图片
//UIImage *image = textAttachment.image;
//返回NO,系统actionSheet不会弹出
return NO;
}
2.png
3.png
YYText
!支持高性能的异步排版和渲染
!扩展了 CoreText 的属性以支持更多文字效果
!支持 UIImage、UIView、CALayer 作为图文混排元素
详情:
YYText-GitHub
- (void)YYText
{
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"12dk990k09edq啊实打实大声道安山东安山东安山东声道安山东安山东安山东声道安山东安山东安山东声道安山东安山东安山东声道安山东安山东安山东声道安山东安山东安山东声道安山东安山东安山东"];
//string.yy_color = [UIColor redColor];
[string yy_setColor:[UIColor redColor] range:NSMakeRange(0, 2)];
string.yy_lineSpacing = 10;
[string yy_setTextHighlightRange:NSMakeRange(3, 10) color:[UIColor cyanColor] backgroundColor:[UIColor orangeColor] userInfo:nil tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
//
} longPressAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
//
}];
//创建一个
UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:@[@"卫星地图",@"普通地图"]];
NSMutableAttributedString *attributeS1 = [NSMutableAttributedString yy_attachmentStringWithContent:segment contentMode:UIViewContentModeScaleAspectFill width:200 ascent:10 descent:10];
[string appendAttributedString:attributeS1];
YYLabel *label = [[YYLabel alloc] initWithFrame:CGRectMake(20, 40, 350, 400)];
label.backgroundColor = [UIColor lightGrayColor];
label.numberOfLines = 0;
label.attributedText = string;
[self.view addSubview:label];
}
1.png
网友评论