Skip to content

TableViewCell 如何根据 UILabel 内容长度自动调整高度 #146

@tbfungeek

Description

@tbfungeek

计算文本的内容内容尺寸一般用boundingRectWithSize方法。这种方式有一定的偏差,需要我们实际调整,但是不影响我们正常使用。

- (CGSize)idl_safeSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode {
    CGSize inSize = CGSizeZero;
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        CGRect frame = [self boundingRectWithSize:size
                                          options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName : font}
                                          context:nil];
        inSize = CGSizeMake(ceilf(frame.size.width), ceilf(frame.size.height));
    }
    
    if (!isnormal(inSize.width)) {
        inSize.width = 0.0;
    }
    return inSize;
}

一般UILabel内容长度用上面的方式就可以大致做到动态调整,但是在 UITableViewCell 中我们往往会引入缓存,这样就不至于每次都得计算内容的高度,我们看上面的方法实际上是不依赖任何界面因素的,只是依赖NSString的内容,lineBreakMode以及容器宽度显示,这样完全可以放在UITableViewCell对应的model中。然后在heightForRowAtIndexPath中首先从缓存中获取,如果没有再从model中调用对应的方法去计算。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    //放回高度
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions