<UILabel>属性attributedText功

作者: 园丁云 | 来源:发表于2016-03-03 10:40 被阅读8012次

前言

14年6月开始接触学习OC语音,这是成为iOS开发者快两年第一次写博,会好好努力学习、研究和分享好东西。(还不会使用Markdown啊啊啊啊啊) 写这篇博客的初意其实是因为帮朋友解决个Demo中自定义label的问题,然后发现里面一些新知识有点意思,在网上搜寻的总结也零零散散不全。我愿走上博客的不归之路。(听说写正经博客更容易找到工作,不知道是真是假,偷笑脸)


// the underlying attributed string drawn by the label, if set, the label ignores the properties above.       label所绘制的基本属性,如果设置,该label将忽略上述属性。(此处说的上述属性下文中会说明)                                    

// @property(nullable, nonatomic,copy)  NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0);  // default is nil   iOS 6开始使用,默认为空

通俗不严谨的讲,UILabel在不使用NSAttributedString *attributedText;属性之前就类似富文本,基本功能赞。在使用此属性之后就类似Markdown,添加更多附加功能,更灵活更强大,level up!


继续使用富文本跟Markdown的比方,使用富文本编辑的时候,是只能使用给出的几个格式功能;使用Markdown编辑的时候,所有的格式功能都需要手写语法,是无法简单地点点富文本基本功能按钮了。在<UIKit/UILabel.h>中,苹果工程师对attributedText说明如果设置改属性,改label讲忽略下列基本属性设置。

NSString  *text;   // 默认为空

UIFont  *font;   // 默认为系统字体17号

UIColor  *textColor;   // 默认为文本黑色

UIColor  *shadowColor;    // 默认没有阴影

CGSize  shadowOffset;    // (如果设置了阴影颜色)默认一个向上的阴影(0,-1)

NSTextAlignment  textAlignment;   // 默认为左对齐

NSLineBreakMode    lineBreakMode;   // 段落样式。超出部分默认最后截断尾巴,用'...'代替

写这篇博客的初意其实是因为帮朋友解决个Demo中自定义label的问题 (YLLabel 中文显示文字对齐

YLLabel实现的文本两端对齐效果与默认UILabel效果

两者一比较YLLabel‘实现’的文本两端对齐效果更佳美观,YLLabel的实现原理点这里。大致意思是:创建个NSMutableAttributedString对象,使用 <CoreText>对应的类与方法设置字体段落格式等,再在UIView或子类中的- (void)drawRect:(CGRect)rect;方法中,是用画布将NSMutableAttributedString按照设置的格式画出来。实质上跟UILabel没任何关系,所以朋友在用YLLabel时无法使用UILabel按照内容计算高度设置AutoLayout进行布局了。


研究和尝试之后找到原因,也找到了解决办法。

1. YLLabel的作者编写YLLabel的时候,iOS6刚出来。iOS 5为止,好像对NSAttributedString支持的不是很好。UILabel的attributedText属性也是在iOS6才支持的,因此YLLabel是使用<CoreText>绘制文本。

2. iOS7之后UIKit全面升级,加入更多新功能新方法,旧方法也得到完善。个人认为:对于我们初中级开发者应优先使用UIKit提供的接口方法来制定界面。(其实UIKit提供的接口方法不就是苹果公司将底层的实现封装好然后开放接口给我们用的吗。)我们不是代码的创造者,我们只是代码的搬运工。

回到主题,解决办法就是使用UILabel的attributedText来解决朋友需要的效果。

最重要的一句代码是:设置段落-对齐方式-两端对齐

paragtaphStyle.alignment = NSTextAlignmentJustified;    // 对齐方式,默认为左对齐,设置为两端对齐即可。

在解决问题的时候遇到了两个新问题:(希望有大神来解答)

1. UILabel 有 NSTextAlignment  textAlignment; 段落对齐方式属性,设置居中对齐,左对齐,右对齐都没问题。唯独设置为两端对齐始终无效。

2. 使用attributedText方法,NSMutableAttributedString对象添加只添加NSParagraphStyleAttributeName时无效,添加NSUnderlineStyleAttributeName之后两端对齐才有效。在网上搜索出的说法是: 设置文字段落的字符串常量 (文字段落框要有宽度和高度才有效果),设置NSUnderlineStyleAttributeName常量是设置base attributes格式。。。

留下的问题会在下次更新解决,然后分享一个多功能Label,更方便设置文本,并添加block方法为部分文本添加点击事件。WPAttributedMarkup 应该是个老外写的,没更新了。

相关文章

网友评论

  • 小草先生:你好,我想问下 表情+文字 能做到文本两端对齐吗
    园丁云:@小草先生 你好,应该是可以的。http://www.jianshu.com/p/c21a608d2ab4 这个可能对你有帮助。
  • a755056ccfb7:如何做到获得内容的高度啊,没有这个岂不是很蛋疼
    园丁云:@kangter 上面那个链接博客里面有说明的,只要将你label设置的attributes,也在计算高度的方法里面传进去,就可以计算出特殊格式label内容的高度了。
    a755056ccfb7:@园丁云 嗯呢 有什么好的方法么
    园丁云:@kangter 你的问题是这个吗。http://www.cnblogs.com/shirley-1019/p/3707434.html

本文标题:<UILabel>属性attributedText功

本文链接:https://www.haomeiwen.com/subject/efynkttx.html