带有附件视图的 iOS 8 自调整单元格

Posted

技术标签:

【中文标题】带有附件视图的 iOS 8 自调整单元格【英文标题】:iOS 8 Self Sizing Cells With Accessory View 【发布时间】:2015-06-25 17:24:07 【问题描述】:

使用 ios 8.3 模拟器和 Xcode 6.3.2。

我在 iOS 8 中使用自调整单元格技术,当单元格没有附件视图时它工作得非常好,但当单元格有附件视图时会中断。我在单元格内的标签上设置了约束:

然后我使用estimatedRowHeight 并将rowHeight 设置为UITableViewAutomaticDimension(我在这里省略了tableView:numberOfRowsInSection:,但在本示例中它只返回3):

@implementation MyTableViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 44.0f;
    self.tableView.rowHeight = UITableViewAutomaticDimension;


...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:@"myCell" forIndexPath:indexPath];

    cell.titleLabel.text = @"Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment ";

    return cell;


@end

然后 bam,一切看起来都很棒:

但是当我在情节提要中添加附件视图时,无需更改任何代码:

第一个牢房下地狱。 Xcode 的视图调试器告诉我标签高度是 1785 点,我不得不在这里使用 gif 来显示它:

我确实注意到其他两个单元格的大小很好。我还注意到,当我旋转模拟器时,第一个单元格会正确调整大小,包括在它旋转回纵向之后。

有谁知道为什么附件视图会如此糟糕,以及我能做些什么来解决它? http://github.com/UberJason/SelfSizingNightmare 提供示例项目。

【问题讨论】:

【参考方案1】:

这确实是一个错误。我已将您的项目发送给 Apple。苹果有回复。

【讨论】:

酷,我会在 iOS 9 beta 3 中查看它!我确实在 beta 1 或 2 中查看过它,它似乎是固定的,尽管在使用具有更多视图的更复杂的布局时,一般来说,自定大小的单元格有时仍然会有点不稳定。希望 Beta 3 能让事情变得坚如磐​​石。【参考方案2】:

这似乎是由于单元格内的标签具有numberOfLines = 0

虽然我不确定为什么,但似乎将附件添加到单元格会导致自动布局在表格首次加载时无法计算标签的高度。

我能够通过向标签添加首选最大宽度来修复您的示例 - 这似乎足以让布局系统及时计算出高度:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:@"myCell" forIndexPath:indexPath];

    // Give the layout system something to help it estimate the label height    
    cell.titleLabel.preferredMaxLayoutWidth = self.titleLabel.bounds.size.width;
    cell.titleLabel.text = @"Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment Test comment ";

    return cell;

或者,在viewDidAppear 中调用[tableView reloadData] 似乎也可以解决它。

【讨论】:

我同意附件视图会导致问题。在这种情况下,设置 preferredMaxLayoutWidth 可能会有所帮助,但我有其他自调整大小的单元格(具有稍微复杂的布局)和辅助视图,但没有帮助。此外,在 viewDidAppear 中调用 [tableView reloadData] 确实有效,但它会带来丑陋的用户体验,因为单元格“弹出”到位......无论如何,这个问题在 iOS 9 beta 中似乎得到了更好的解决,所以我只是决定不真的很担心。

以上是关于带有附件视图的 iOS 8 自调整单元格的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 带有 UITextView 的表格视图单元格未正确调整大小

自定义 UITableViewCell 和调整单元格高度

在自定义单元格中调整 iOS 7.1 中的 UILabel 大小

UICollectionViewCell 的高度,带有 2 个多行 UILabel / 自调整大小的集合视图单元格

iOS自动调整UITableViewHeaderFooterView.ContentView子视图中的自定义单元格宽度

iOS 8 具有可变高度的自调整单元格