主要类: NSAttributedString 和 NSMutableAttributedString
** 需要用到的了NSTextAttachment:文本附件,有参考网上代码 **
用法:
- 富文本类有点类似于字符串但是他可以实现比字符串更强大的功能,在字符串上给颜色,大小,下划线.介于lable和NSString之间
- 可以添加图片附件(NSTextAttachment)微博的emoji表情和文字混搭.(YYKit框架中的lable类)
- 实现超链接.(副文本实现超链接,只能通过UITextView实现.
代码1:常见用法
这里仅仅介绍一些有用的键,很多没用的不介绍了.
方式一:
// 方式-(逐条加入键值对,不太好记)
NSString *str = @"人生若只如初见,何事悲风秋画扇。\n等闲变却故人心,却道故人心易变。\n骊山语罢清宵半,泪雨霖铃终不怨。\n何如薄幸锦衣郎,比翼连枝当日愿。";
NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc]initWithString:str];
// rang表示从哪里开始多长
//设置字体和设置字体的范围
[aStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30.0f] range:NSMakeRange(0, 3)];
//添加文字颜色
[aStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(17, 7)];
//添加文字背景颜色
[aStr addAttribute:NSBackgroundColorAttributeName value:[UIColor orangeColor] range:NSMakeRange(17, 7)];
//添加下划线
[aStr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(8, 7)];
方式二:(一起添加)
NSString *str1 = @"设置字体格式和大小";
NSDictionary *dict1 = @{
//字体大小
NSFontAttributeName :[UIFont systemFontOfSize:33.0f],
//前端颜色,显示颜色
NSForegroundColorAttributeName : [UIColor redColor],
NSBackgroundColorAttributeName : [UIColor orangeColor],
//下划线功能,但是没有办法调整距离.需要手动增加控件
NSUnderlineStyleAttributeName : [NSNumber numberWithInteger:NSUnderlineStyleSingle],
//基线(没什么用).只是一个位置标示,字体对齐和表情的时候好像需要使用
NSBaselineOffsetAttributeName:@(5)
};
NSMutableAttributedString *aStr1 = [[NSMutableAttributedString alloc]initWithString:str1 attributes:dict1];
/*!
注:NSKernAttributeName用来设置字符之间的间距,取值为NSNumber对象(整数),负值间距变窄,正值间距变宽
*/
NSString *str4 = @"\n设置字符间距";
NSDictionary *dictAttr4 = @{NSKernAttributeName:@(4)};
NSAttributedString *attr4 = [[NSAttributedString alloc]initWithString:str4 attributes:dictAttr4];
[aStr1 appendAttributedString:attr4];
/*!
注:NSStrikethroughStyleAttributeName设置删除线,取值为NSNumber对象,枚举NSUnderlineStyle中的值。NSStrikethroughColorAttributeName设置删除线的颜色。并可以将Style和Pattern相互 取与 获取不同的效果
*/
NSString *str51 = @"\n设置删除线为细单实线,颜色为红色";
NSDictionary *dictAttr51 = @{NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),NSStrikethroughColorAttributeName:[UIColor redColor]};
NSAttributedString *attr51 = [[NSAttributedString alloc]initWithString:str51 attributes:dictAttr51];
[aStr1 appendAttributedString:attr51];
代码2:添加图片附件
//设置文本附件NSAttachmentAttributeName,取值为NSTextAttachment对象,常用于文字的图文混排
NSString *str9 = @"文字的图文混排\n";
NSTextAttachment *textAttachment = [[NSTextAttachment alloc]init];
textAttachment.image = [UIImage imageNamed:@"搜索"];
textAttachment.bounds = CGRectMake(0, 0, 30, 30);
NSDictionary *dictAttr9 = @{NSAttachmentAttributeName:textAttachment};
NSAttributedString *attr9 = [[NSAttributedString alloc]initWithString:str9 attributes:dictAttr9];
//添加图片附件
[aStr1 appendAttributedString:attr9];
//图片附件还可以插入
[aStr1 insertAttributedString: attr9 atIndex:range.location];
//存在两个问题1.图片大小不对,2图片和文字不对齐不居中.
//1. 继承NSTextAttachment重写这个方法,可以使大小相同lineFrag代表本的lable一行的宽高,都取高度才正确
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex {
return CGRectMake(0, 0, lineFrag.size.height, lineFrag.size.height);
}
//2. 通过基线处理
代码3: 超链接:NSLinkAttributeName属性,但是使用这个有几点注意
之所以把 NSLinkAttributeName 属性单独列出来,是因为在 UILabel 和 UITextField 中是无法使用该属性的。更准确点说是在UILabel 和 UITextField 中无法实现点击链接启动浏览器打开一个URL地址,因为在此过程中用到了一个代理函数。只能用在 UITextView 中。
NSLinkAttributeName 的对象是 NSURL 类型 或 NSString,但是优先使用 NSURL。
需要实现UITextView的代理方法 - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange,在该方法中,返回 YES,则会打开URL地址,返回 NO则不会.
- (void)test4 {
NSDictionary *dict = @{
// NSURL (preferred) or NSString
NSLinkAttributeName : [NSURL URLWithString:@"http://www.baidu.com"]
};
NSAttributedString *aStr = [[NSAttributedString alloc]initWithString:@"百度" attributes:dict];
// self.lable.attributedText = aStr;
self.textView.attributedText = aStr;
//可编辑就不可点击
self.textView.editable = NO;
self.textView.delegate = self;
}
#pragma mark - UITextViewDelegate 是否能够连接互联网
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction {
return YES;
}
列出所有能用到的属性:
NSFontAttributeName, NSForegroundColorAttributeName, NSBackgroundColorAttributeName, NSUnderlineStyleAttributeName, NSBaselineOffsetAttributeName, NSKernAttributeName, NSStrikethroughStyleAttributeName, NSAttachmentAttributeName, NSLinkAttributeName