如何在不指定估计行高的情况下使用 iOS 自动调整单元格大小?

Posted

技术标签:

【中文标题】如何在不指定估计行高的情况下使用 iOS 自动调整单元格大小?【英文标题】:How do I use iOS auto resizing cells without specifying estimated row height? 【发布时间】:2015-03-01 05:14:29 【问题描述】:

我想在 ios 8 中利用 Auto Layout 自动处理我的单元格高度,但我讨厌估计的行高会导致滚动(跳跃、滚动位置不可预测等)。

有没有办法不使用估算,以便表格视图像 iOS 7 之前那样预先计算所有行高(单元格不多,所以不是性能问题),但使用 iOS 8 的自动计算高度?

【问题讨论】:

【参考方案1】:

编辑:

如果不使用此属性,则无法使用动态调整大小。 estimatedRowHeight 告诉系统使用动态大小,假设您在单元格中使用了自动布局。

观看 WWDC 2014 视频 226。

//

非常简单 - 在 Storyboard 中创建原型单元格,将约束添加到超级视图顶部/底部(也称为单元格内容视图),这意味着您的子视图具有顶部/底部约束,将在必要时“推动”单元格大小。

将 TableView 和 Cell 高度都设置为默认值。如果这是问题(自动布局需要比默认的 44 pts 更高的高度),请确保在代码中执行此操作: tableView.rowHeight = UITableViewAutomaticDimension 不要忘记设置estimatedRowHeight 告诉系统您要启用动态调整大小。

【讨论】:

我没有指定estimatedRowHeight就问了。这是你的最后一行。 是的。你可以不这样做,但这会使高度不稳定。您必须至少提供默认值 (44) 才能让表格与自动布局一起正常工作。 +1,如果您(像我一样)不清楚答案,我自己的问题也是这样:***.com/q/33051556/1028256【参考方案2】:

自动调整大小要求您提供估计的行高,但您可以使用自动布局预先计算行高。

为此,您需要一个“虚拟”单元格,其中填充了您要计算的单元格大小的数据。然后您可以使用自动布局为您完成工作:

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

    static YourCell *dummy = nil;
    static NSLayoutConstraint *widthConstraint = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        UINib *nib = [UINib nibWithNibName:@"YourCell" bundle:nil];
        dummy = [[nib instantiateWithOwner:nil options:nil] firstObject];
        widthConstraint = [NSLayoutConstraint 
constraintWithItem:dummy.contentView attribute:NSLayoutAttributeWidth 
relatedBy:NSLayoutRelationEqual toItem:nil attribute:
NSLayoutAttributeWidth multiplier:1.0 constant:320.0]; 
        widthConstraint.priority = 750; //Good idea to lower priority of this constraint so it doesn't interfere with whatever table view sets internally
        [dummy addConstraint:widthConstraint];
    );

    //account for current table view width
    widthConstraint.constant = tableView.bounds.width; 

    //...
    //Configure dummy cell here
    //...

    CGSize size = [dummy systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size.height;

【讨论】:

我发现如果没有在作为单元格大小决定因素的标签上设置显式宽度,它似乎不起作用。是否可以不这样做,因为它在设备旋转时会使尺寸复杂化?而对于设置单元格的宽度,您是指单元格中的子视图吗?如果是这样,将其放置在远离所有侧面(设置前导、尾随、顶部和底部间距)是否足够?您可以通过什么方式在示例项目中展示这一点? 将样本推送到 github github.com/alexchugunov/Examples/tree/master/…。重要的部分是在 contentView 上添加宽度约束,因为 contentView 没有它,除非单元格是由 table view 创建的。另外,忽略我之前在 contentView 上调用 systemLayoutSizeFittingSize 的建议。您应该在单元格本身上执行此操作,因为它将考虑单元格内的分隔符和其他视图。也编辑了我的答案。 表格视图如何创建单元格? 在上面的示例中,我使用 UINib 类创建了一个单元格(Xib 文件中有一个 UITableViewCell 视图)。请注意,我只使用此单元格来计算大小。表格视图将负责创建将实际显示的所有单元格。 您好@DougSmith,您解决了这个问题吗?我也面临着类似的问题,我的问题在这里***.com/questions/29101840/…【参考方案3】:

你可以使用任何一个

 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath  

_activityTable.estimatedRowHeight = [CompanyEventCell cellHeight];

【讨论】:

以上是关于如何在不指定估计行高的情况下使用 iOS 自动调整单元格大小?的主要内容,如果未能解决你的问题,请参考以下文章

调整 UIButton 宽度/高度 (iOS) - 如何在不禁用自动布局的情况下解决?

iOS UITableView 解决估算行高和指定行高的矛盾

在不使用自动布局的情况下调整 iPhone 5 屏幕尺寸

excel小技巧之快速调整行高列宽 如何快速调整行高列宽

POI生成excel如何实现自动调整行高

聊一聊 Sketch 与 iOS 文字的行高