在我的应用中,我在UISearchBar
下面有一个UINavigationBar
,因此用户始终可以看到它。在这种情况下,我必须将contentInset
设置为额外的44px,以便UIScrollView
将在UISearchBar
下滚动(与Contacts.app完全相同)。静态UITableView
没有问题,但在我的情况下,我必须重新加载它的内容,切换到UISearchDisplayController
等。所以当我打电话时:
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];
一切正常,直到例如我拉动刷新...(为此我使用SSPullToRefresh
)。
所以我的问题是:如何永久设置contentInset
以便我不必担心UITableView
内的数据发生任何变化?
答案 0 :(得分:183)
可能这是我的错误,因为我搞乱了自动布局和故事板,但我找到了答案。
你必须在 View Controller的属性检查器中照顾这个小家伙
必须取消选中,以便在更改后不会设置默认contentInset
。
之后,只需在viewDidLoad
添加一行代码:
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example
iOS 11,Xcode 9更新
如果涉及 iOS 11 和 Xcode 9 ,以前的解决方案看起来不再正确。 automaticallyAdjustsScrollViewInsets
已被弃用,目前为了达到类似的效果,您必须转到尺寸检查器,您可以在其中找到:
此外,您可以在代码中实现相同的目标:
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
答案 1 :(得分:59)
在斯威夫特:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
}
答案 2 :(得分:7)
在iOS11中不推荐使用automaAdjustsScrollViewInsets(并且已接受的解决方案不再有效)。使用:
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
答案 3 :(得分:4)
在numberOfRowsInSection中添加您的代码[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];
。因此,您将设置contentInset始终重新加载表格中的数据
答案 4 :(得分:2)
经过一个小时的测试后,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];
}
使用这种方法,如果为空,您可以随时隐藏搜索栏
答案 5 :(得分:2)
这是通过Storyboard(iOS 11和Xcode 9.1)轻松修复的方法:
选择表格视图&gt;尺寸检验员&gt;内容插入:从不
答案 6 :(得分:0)
尝试设置tableFooterView tableView.tableFooterView = UIView(帧:CGRect(x:0,y:0,宽度:0,高度:CGFloat.leastNonzeroMagnitude))
答案 7 :(得分:0)
self.rx.viewDidAppearOnce
.flatMapLatest { _ in RxKeyboard.instance.isHidden }
.bind(onNext: { [unowned self] isHidden in
guard !isHidden else { return }
self.tableView.beginUpdates()
self.tableView.contentInsetAdjustmentBehavior = .automatic
self.tableView.endUpdates()
})
.disposed(by: self.disposeBag)