iOS 8 自动高度单元格在第一次加载时高度不正确

iOS 8 Auto height cell not correct height at first load

我有一个 iOS 8 应用程序,其中有一个搜索结果页面,每个单元格都根据特定标签的高度自动调整大小。但是,在视图首次加载后,显示的单元格不会自动调整大小。向下滚动后,后面的单元格大小正确。我在故事板中连接了自动布局约束。我在 viewDidLoad 中有以下代码。

- (void)viewDidLoad {
    [super viewDidLoad];

    //configure tableView so that we use autolayout enabled row heights
    self.tableView.estimatedRowHeight = 68;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}

有没有其他人遇到过这种情况?

是的,我在情节提要中创建视图和约束时遇到了同样的问题(但代码添加的视图没有)。我通过在自定义单元格 class、

中添加此代码来解决此问题
-(void)didMoveToSuperview { 
    [self layoutIfNeeded];
}

这可能会去其他地方,但是这个方法似乎只被调用一次,所以我认为这是一个很好的地方。

rdelmar 的答案对我不起作用。

我所做的是添加这段代码:

[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData];

在获取数据并首先调用 [tableView reloadData] 之后,在我的例子中,它位于我的视图控制器的 viewDidLoad 方法中。

因此结果代码为:

NSArray *fetchedData = ...

[tableView reloadData]; //Fist table reload
[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData]; //Second table reload

这个答案取自这里:http://useyourloaf.com/blog/self-sizing-table-view-cells.html#comment-1783719287

我能够通过不使用 nibs/storyboards 而是以编程方式完成布局来解决这个问题。

我认为与其在 viewDidLoad 中强制使用 tableView.reloadData()tableView.layoutIfNeeded(),不如在 viewWillLayoutSubviews():

中设置 tableView 的自动高度

Swift:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    tableView.estimatedRowHeight = 300
    tableView.rowHeight = UITableViewAutomaticDimension
}

我遇到了同样的问题,并通过将分配给单元格的 UILabels 文本属性(是唯一可能影响我的特定单元格中的高度计算的组件)的分配移动到:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

而不是:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

在执行此操作之前,我注意到如果单元格暂时滚动到屏幕外然后又回到视图中,则可以正确计算单元格高度。很可能是因为,此时单元格具有有关确定最终高度的 UILabel 内容的必要信息。