iOS heightForRowAtIndexPath 正确计算方式

标签 ios uitableview

我想学习一种通用且正确的自定义单元格高度计算方法。
我的单元格是从 nib 加载的,它们有两个多行 UILabels,一个在另一个之上。
目前,我在 viewDidLoad 中创建特殊配置单元格,并在 heightForRowAtIndexPath 中使用它。

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    [self configureCell:self.configurationCell forIndexPath:indexPath];
    CGRect configFrame = self.configurationCell.frame;
    configFrame.size.width = self.view.frame.size.width;
    self.configurationCell.frame = configFrame;

    [self.configurationCell layoutSubviews];

    UILabel *label = (UILabel *)[self.configurationCell viewWithTag:2];
    float height = label.frame.origin.y + label.frame.size.height + 10;

    return height;
}

它有效,但似乎是一种不礼貌的方式。我认为必须为每个项目和每个方向预先计算高度。但我找不到使它变得漂亮和直接的方法。
你能帮帮我吗?
单元格标签的样式(如字体和屏幕边框的偏移量)必须从 nib 文件加载(单元格在 nib 内)。

添加单元格的 layourSubviews 方法:

-(void) layoutSubviews {

    [super layoutSubviews];

    [self.shortDescriptionLabel resize];

    CGRect longDescriptionFrame = self.longDescriptionLabel.frame;
    longDescriptionFrame.origin.y = self.shortDescriptionLabel.frame.origin.y + self.shortDescriptionLabel.frame.size.height + 5;
    self.longDescriptionLabel.frame = longDescriptionFrame;

    [self.longDescriptionLabel resize];
}

标签的调整大小方法只是增加它的高度以适应所有文本。所以单元格的高度计算为longDescriptionLabel.bottom + 10。代码简单但不是很漂亮。

最佳答案

看来您正在尝试在 heightForRowAtIndexPath 中创建 subview 。 View 创建应该在 cellForRowAtIndexPath 中完成。

根据您的实现,您只能在布局后确定单元格的高度。这并不好,因为 UITableView 在数据重新加载时为每个单元格调用 heightForRowAtIndexPath,而不仅仅是可见单元格。因此,即使不需要可见,也会创建所有单元格的 subview 。

要优化此实现,您必须计算出某种公式以允许在不布置 View 的情况下确定高度。即使您的布局是弹性的或具有可变高度,给定文本矩形,您仍然可以确定其高度。使用 [NSString sizeWithFont:] 确定其显示的矩形。在您的数据委托(delegate)中记录此信息。调用heightForRowAtIndexPath时,直接返回。

关于iOS heightForRowAtIndexPath 正确计算方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928033/

相关文章:

ios - 如何防止将 UIAppearance 与 UIView 的 tintColor 一起使用更改所有 UITabBar 图标颜色?

ios - WatchKit 扩展崩溃

iphone - UITableView 查找部分标题的位置?

ios - 从通知面板清除相同类别的本地通知,iOS

ios - UITableViewController 中的顶部栏背景

iphone - 如何使用iphone tableView的reloadData方法

ios - Phonegap/Cordova Youtube在iOS上嵌入视频无法正常工作

ios - ClipsToBounds 在单元格中不起作用

ios - 如何在 Swift 中编辑动态 UITableViewCell 中的 View ?

ios - UITableView 的 headerview 中的 UISwitch 正在更改状态但不调用事件处理方法