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

时间:2015-01-05 20:42:01

标签: ios uitableview ios8 autolayout

我有一个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;
}

还有其他人经历过这个吗?

5 个答案:

答案 0 :(得分:32)

是的,我在故事板中制作视图和约束时看到了同样的问题(但没有添加代码添加视图)。我通过在自定义单元格类中添加此代码来修复此问题,

-(void)didMoveToSuperview { 
    [self layoutIfNeeded];
}

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

答案 1 :(得分:20)

rdelmar的回答对我不起作用。

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

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

获取数据并调用第一个[tableView reloadData]后,在我的情况下,它位于我的View Controller的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

答案 2 :(得分:1)

我认为您可以在tableView.reloadData()中设置tableView的自动高度,而不是在tableView.layoutIfNeeded()中强制viewDidLoadviewWillLayoutSubviews()

斯威夫特:

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

答案 3 :(得分:1)

我遇到了同样的问题并通过将任务移动到小区的UILabels'来解决问题。文本属性(是可能影响我特定单元格中高度计算的唯一组件):

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

而不是:

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

在执行此操作之前,我注意到如果单元格在屏幕外滚动然后返回视图,则可以正确计算单元格高度。最有可能的原因是,在那时,细胞具有关于确定最终高度的UILabel含量的必要信息。

答案 4 :(得分:0)

我可以通过不使用笔尖/故事板来解决这个问题,而是以编程方式完成布局。

相关问题