永久性地设置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中照顾这个小家伙
它必须被取消选中,所以默认的contentInset
在任何改变之后都不会被设置。 之后,它只是添加一行,以viewDidLoad
:
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example
iOS 11,Xcode 9更新
看起来像以前的解决scheme不再是一个正确的,如果涉及到iOS 11和Xcode 9 。 automaticallyAdjustsScrollViewInsets
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表格视图>尺寸检查器>内容插图:从不