工作终于到了一个这样的场景,判断文本是否超过10行,如果超过的话,则添加更多按钮。
让文本不超过10行,我们可以直接通过设置Label的numberOfLines
为10实现,但是更多按钮的显示,则需要判断文本高度是否超过10行。
一般方法为通过boundingRectWithSize
方法获得文本高度 ➗
单行文本高度 =
行数,然后再进行判断。
但是如果文本分段,存在段间距及行间距的情况下,行数的计算就显得尤为不准确。所以,我采用了以下这种方式。
//获取文本行数
- (int)getNumberOfLinesWithText:(NSMutableAttributedString *)text andLabelWidth:(CGFloat)width {
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)text);
CGMutablePathRef Path = CGPathCreateMutable();
CGPathAddRect(Path, NULL ,CGRectMake(0 , 0 , width, INT_MAX));
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL);
// 得到字串在frame中被自动分成了多少个行。
CFArrayRef rows = CTFrameGetLines(frame);
// 实际行数
int numberOfLines = CFArrayGetCount(rows);
CFRelease(frame);
CGPathRelease(Path);
CFRelease(framesetter);
return numberOfLines;
}