iOS 8 - 最初从视图中隐藏UITableView的headerView

时间:2015-01-29 06:54:38

标签: ios objective-c iphone uitableview uiscrollview

就像在本机iOS Mail应用程序中一样,当我将UITableViewController推送到UINavigationController时,我想让UITableView最初略微向下滚动,遮挡导航控制器导航栏下方的headerView。

同时,即使所有单元格的高度小于表格视图的高度,用户也应该可以向上和向下滚动以显式显示或隐藏标题视图。< / p>

有了这个逻辑,似乎有两个考虑因素要做这个实现:

1)确保表格视图的最小内容大小至少是表格视图框架的高度+标题视图的高度。

2)最初显示表格视图时,内容偏移量会增加标题视图的高度。

我尝试在'viewWillAppear'中手动设置表视图的contentOffset和contentSize属性,但是这似乎没有效果(在该点之后可能会重新加载表视图)。试图在'viewDidAppear'中设置它们会起作用,但是为时已晚,因为只有在'push'动画完成后才会调用它。

虽然之前的iOS版本之前已经提出了这类问题,但我无法让其中任何一个在iOS 8中运行。此外,它们都处理了更改偏移量,但没有更改表格视图的contentSize。 / p>

有没有人在iOS 7和/或8之前使用过这种行为?

1 个答案:

答案 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'。