如何在不指定估计行高的情况下使用 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) - 如何在不禁用自动布局的情况下解决?