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 内容的必要信息。
我有一个 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()
:
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 内容的必要信息。