这可能是苹果系统的一个bug。
根本原因:UILabel上的文字只要包含有“中文”,富文本字符串的中划线就会失效,我们可通过以下两种方式解决。
增加一个富文本属性: NSBaselineOffsetAttributeName : @(NSUnderlineStyleSingle)
项目中有一个需求就是实现一段文字中有几个特殊的字符可以有下划线,并且可以进行点击。首先可以实现下划线效果,首先想到的是UILabel和UITextView控件的 NSMutableAttributedString 属性,考虑到可能会有点击事件效果的实现,这里选择UITextView控件,因为UITextView有一个功能就是能通过NSRange获得文字的相应的Frame。
最终实现这种效果,带下划线的可以点击,点击可以设置背景颜色,也可以不设置背景颜色,可以设置下换线以及下划线上面文字的颜色。
1、首先创建UITextView类
2、ClickTextView类中声明点击回调的block,这里回调用block进行回调
3、介绍下主要的实现方法
1>、这个方法主要是将下划线对用的文字的frame,文字内容,点击效果背景颜色存储起来,以供点击的时候查询
2>、通过一个点击的点,去查找有没有点在下划线对用的文字范围内,并且返回之前打包<存储的字典>的数据模型
3>、通过touchesBegan的方法,获取点击的点,并且去查询相关数据模型,并且根据参数是不是展示相应的点击效果,并且通过blcok进行回调
4>、点击结束的时候取消点击效果,也就是删除点击的时候创建的view
5、在ViewController中进行测试
如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。
详情 Demo 可参考
扩展: iOS 设置下划线与文字之间的距离
富文本
NSString*str =@"人生若只如初见,何事秋风悲画扇。\n等闲变却故人心,却道故人心易变。\n骊山语罢清宵半,泪雨霖铃终不怨。\n何如薄幸锦衣郎,比翼连枝当日愿。"NSMutableAttributedString*attrStr = [[NSMutableAttributedStringalloc] initWithString:str]
attrStr添加字体和设置字体的范围
[attrStraddAttribute:NSFontAttributeName value:[UIFontsystemFontOfSize:30.0f] range:NSMakeRange(0,3)]
attrStr添加文字颜色
[attrStraddAttribute:NSForegroundColorAttributeName value:[UIColorredColor] range:NSMakeRange(17,7)]
attrStr添加下划线
[attrStr addAttribute:NSUnderlineStyleAttributeNamevalue:[NSNumbernumberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(8,7)]
段落样式
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init]//行间距paragraph.lineSpacing =10//段落间距paragraph.paragraphSpacing =20//对齐方式paragraph.alignment = NSTextAlignmentLeft//指定段落开始的缩进像素paragraph.firstLineHeadIndent =30//调整全部文字的缩进像素paragraph.headIndent =10
attrStr添加段落设置
[attrStr addAttribute:NSParagraphStyleAttributeNamevalue:paragraph range:NSMakeRange(0, [str length])]NSString*urlStr =@"www.南瓜瓜.com"NSURL*url = [NSURLURLWithString:urlStr]
label添加链接
注意:label链接是可以显示出来,但是点不了,有兴趣的朋友可以试试。查资料发现textView是可以点击的,有shouldInteractWithURL代理方法回调。
[attrStraddAttribute:NSLinkAttributeName value:url range:NSMakeRange(42,7)]
创建label
UILabel*label = [[UILabelalloc] initWithFrame:CGRectMake(60,100,200,0)]label.backgroundColor= [UIColorlightGrayColor]//自动换行label.numberOfLines=0//设置label的富文本label.attributedText= attrStr//label高度自适应[label sizeToFit][self.viewaddSubview:label]
设置sizeToFit之后是可以取出label的高度的,这样做label高度自适应。
CGFloatheight = label.frame.size.heightNSLog(@"height = %f",height)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)