ios label.lineBreakMode代替方案,实现超出部分截断的功能

自带的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;
            }
        }
    }
}

你可能感兴趣的:(ios label.lineBreakMode代替方案,实现超出部分截断的功能)