就像在本机iOS Mail应用程序中一样,当我将UITableViewController推送到UINavigationController时,我想让UITableView最初略微向下滚动,遮挡导航控制器导航栏下方的headerView。
同时,即使所有单元格的高度小于表格视图的高度,用户也应该可以向上和向下滚动以显式显示或隐藏标题视图。< / p>
有了这个逻辑,似乎有两个考虑因素要做这个实现:
1)确保表格视图的最小内容大小至少是表格视图框架的高度+标题视图的高度。
2)最初显示表格视图时,内容偏移量会增加标题视图的高度。
我尝试在'viewWillAppear'中手动设置表视图的contentOffset和contentSize属性,但是这似乎没有效果(在该点之后可能会重新加载表视图)。试图在'viewDidAppear'中设置它们会起作用,但是为时已晚,因为只有在'push'动画完成后才会调用它。
虽然之前的iOS版本之前已经提出了这类问题,但我无法让其中任何一个在iOS 8中运行。此外,它们都处理了更改偏移量,但没有更改表格视图的contentSize。 / p>
有没有人在iOS 7和/或8之前使用过这种行为?
答案 0 :(得分:1)
更新 - (2015年1月30日)
好的。昨晚我和我坐在一起不太好,所以我又玩了一次,我找到了更好更清洁的解决方案。
我发现tableView
的{{1}}属性不是UITableViewController
。因此,简单地管理readonly
子类中的contentSize
属性然后将该子类分配回UITableView
实际上更有意义。
UITableViewController
这样,表视图的最小@implementation TOCustomTableView
- (void)setContentSize:(CGSize)contentSize
{
CGFloat scrollInset = self.contentInset.top + self.contentInset.bottom;
CGFloat height = (CGRectGetHeight(self.bounds) - scrollInset) + CGRectGetHeight(self.tableHeaderView.frame);
contentSize.height = MAX(height, contentSize.height);
[super setContentSize:contentSize];
}
@end
---
@implementation TOCustomTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView = [[TOCustomTableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
}
@end
始终显式设置为表视图的高度+ headerView大小,实现零抖动所需的效果。 :)
原始答案
trick14指出了正确的方向。所以我最终得到了正确运行的代码。
contentSize
每次在表视图上执行'reloadData'时,我也确保调用'resetTableViewContentSize'。