自带的lineBreakMode对中文不够友好,截断方式NSLineBreakByWordWrapping,NSLineBreakByCharWrapping,NSLineBreakByClipping都有可能把中文截成半个,所以想到通过遍历或递归直接截掉text。
递归效率<遍历且存在人为疏忽的crash,遍历优选二分法,代码如下:
//只需将label传入,这里前提是限制了label的宽度
- (void)clipLabel:(UILabel *)label {
if ([label.text sizeWithAttributes:@{NSFontAttributeName:label.font}].width > label.width) {
NSInteger low = 0;
NSInteger high = label.text.length - 1;
while (low <= high)
{
NSInteger mid = low + ((high - low) >> 1);
NSString *moddleText = [label.text substringToIndex:mid];
CGFloat middleWidth = [moddleText sizeWithAttributes:@{NSFontAttributeName:label.font}].width;
if ([@(middleWidth) compare:@(label.width)] == NSOrderedAscending)
{
//文字完全展示 && 空余不足一个字
if (fabs(label.width - middleWidth) < label.font.pointSize)
{
label.text = moddleText;
return;
}
low = mid + 1;
}
else
{
high = mid - 1;
}
}
}
}
网友评论