最近开始关注一些细节问题,比如行高。

UILabel可以通过设置NSMutableParagraphStyle来指定行间距,于是在计算高度的时候就遇到了前所未有的坑。

UILabel内容虽然只有一行,但是底部却多出来了行高。。。对比中间和英文行就可以发现这不科学啊 f**k!什么鬼啊!

一点也不完美!

只好硬着头皮去处理这种问题了:

1.判断内容会有显示几行

2.如果内容只有一行的时候减去行间距

3.如果是一行英文则略过2

目前只发现会有这些问题,于是就开始码吧:

1.计算文字行数(UILabel高度-行高 <= 行间距时只有一行)

+ (float)calcHeight:(TopicDetailContentModel *)model {
    UIFont *font = [UIFont systemFontOfSize:13.0f];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:12.0f];

    CGSize size = [model.content boundingRectWithSize:CGSizeMake(kScreenWidth - 16*2, CGFLOAT_MAX)
                                              options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{NSFontAttributeName : font, NSParagraphStyleAttributeName: paragraphStyle}
                                              context:nil].size;

    // 如果只有一行文字则去掉行高
    if (size.height - font.lineHeight <= paragraphStyle.lineSpacing) {
        if ([ActivityTextCell containsChinese:model.content]) {
            return size.height - paragraphStyle.lineSpacing;
        }
    }

    return size.height;
}

2.纯英文单行不作处理

// 判断是否包含中文字符
+ (BOOL)containsChinese:(NSString *)string {
    for (int i = 0; i < string.length; i++) {
        unichar c = [string characterAtIndex:i];
        if (c >0x4E00 && c <0x9FFF) {
            return YES;
        }
    }
    return NO;
}

bingo
e43cce8e-1679-44fa-8a51-e2ce4351e33b