我是一个iOS开发。最近偏爱使用UIButton控件。
第一篇《用UIButton做出cell的点击效果》提到的需求为:“界面的某些内容点击出现背景色,触发点击事件,点击后背景色消失”,加上附加需求“内容最多展示三行,大于三行的,在三行末尾,显示...”,且需求上标出了行距。
当遇见此类需求,可能,不会青睐UIButton,选择自己封装UILabel,或第三方的来实现。我下面给出我的一种思路,用UIButton实现,抱砖引玉啦。
我觉得难点有两个,难点一个是,“...”显示在末位。因为我之前只是惯用语UIButton的部分常用属性,所见到的“...”都是放在中间的。开始自我设计了一些方案,能够实现,但都不能准确定位三行的末尾。原因是内容可能是汉子,字符串,数字等的不同组合。后来找到了UIButton的titleLabel的lineBreakMode设置为NSLineBreakByTruncatingTail,轻松搞定了。
难点二是,当内容很多时,如何准确的算出三行高度。借用了第三方TTTAttributedLabel中方法:
//第一个参数,是将要计算高度的富文本字符串。第二个参数是,允许的最大size。第三个参数是,允许的最大行数
+ (CGSize)sizeThatFitsAttributedString:(NSAttributedString *)attributedString
withConstraints:(CGSize)size
limitedToNumberOfLines:(NSUInteger)numberOfLines
从方法的参数入手,需要先创建富文本字符串。通过设置NSMutableParagraphStyle对象,设置字号,字体,行距,和lineBreakMode,创建特定格式的富文本字符串。在传入上述方法中。设置第三个参数为3和size参数,即可得到制定行数的高度。
用- (void)setAttributedTitle:(nullable NSAttributedString *)title forState:(UIControlState)state方法,来加载富文本字符串,并设置UIButton的titleLabel.numberOfLines为3。
需要注意的是,lineBreakMode在计算高度时,值为:NSLineBreakByWordWrapping。在UIButton上显示时,值为:
NSLineBreakByTruncatingTail。在加载富文本字符串时,需要设置UIButton的titleLabel.numberOfLines。