// 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‘实现’的文本两端对齐效果更佳美观,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 应该是个老外写的,没更新了。