永久性地设置UITableView内容

在我的应用程序,我有一个UISearchBar UINavigationBar下,所以它总是可见的用户。 在这种情况下,我不得不设置额外的44px的contentInset,所以UIScrollView将在UISearchBar下滚动(就像在Contacts.app中一样) 。 而静态UITableView的没有问题,但在我的情况下,我不得不重新加载它的内容,切换到UISearchDisplayController等,所以当我打电话:

 [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; 

一切工作,直到例如我拉刷新…(为此我使用SSPullToRefresh )。

所以我的问题是: 我如何永久设置contentInset所以我不必担心UITableView数据发生任何变化?

也许这是我的错误,因为我搞乱了自动布局和故事板,但我find了答案。

你必须在View Controller的 Attribute Inspector中照顾这个小家伙 ASVI

它必须被取消选中,所以默认的contentInset在任何改变之后都不会被设置。 之后,它只是添加一行,以viewDidLoad

 [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example 

iOS 11,Xcode 9更新

看起来像以前的解决scheme不再是一个正确的,如果涉及到iOS 11Xcode 9automaticallyAdjustsScrollViewInsets ScrollViewInsets已被弃用,现在要达到类似的效果,你必须去的大小检查 ,你可以find这个: 在这里输入图像说明
另外,您可以在代码中实现相同的function:

 if #available(iOS 11.0, *) { scrollView.contentInsetAdjustmentBehavior = .never } else { automaticallyAdjustsScrollViewInsets = false } 

在Swift中:

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0) } 

自动调整ScrollViewInsets在iOS11中已被弃用(并且接受的解决scheme不再有效)。 使用:

 if #available(iOS 11.0, *) { scrollView.contentInsetAdjustmentBehavior = .never } else { automaticallyAdjustsScrollViewInsets = false } 

joinnumberOfRowsInSection你的代码[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; 。 所以你会设置你的contentInset总是重新加载你的表中的数据

经过一个小时的testing,100%的工作是唯一的方法:

 -(void)hideSearchBar { if([self.tableSearchBar.text length]<=0 && !self.tableSearchBar.isFirstResponder) { self.tableView.contentOffset = CGPointMake(0, self.tableSearchBar.bounds.size.height); self.edgesForExtendedLayout = UIRectEdgeBottom; } } -(void)viewDidLayoutSubviews { [self hideSearchBar]; } 

使用这种方法,您可以随时隐藏search栏,如果是空的

这是如何通过故事板(iOS 11和Xcode 9.1)很容易修复的:

select表格视图>尺寸检查器>内容插图:从不