永久设置 UITableView 内容插入

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

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

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

所以我的问题是: 如何永久设置 ABC0,这样我就不必担心 UITableView中的数据发生任何变化?

157002 次浏览

将您的代码 [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];添加到 numberOfRowsInSection 中。因此您将设置 contentInset 总是在表中重新加载数据

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

你必须照顾这个小家伙在 查看控制器属性检查员 asvi

它必须取消选中,这样在任何更改之后都不会设置默认的 contentInset。 在那之后,它只是在 viewDidLoad中添加了一句俏皮话:

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

IOS 11,Xcode 9更新

看来以前的解决方案不再是一个正确的,如果它涉及到 IOS11Xcode 9automaticallyAdjustsScrollViewInsets已经被否定了,现在为了达到类似的效果,你必须去 尺寸检查员,在那里你可以找到这个: enter image description here
此外,还可以在代码中实现相同的目标:

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

经过一个小时的测试,唯一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];
}

使用这种方法,如果搜索栏是空的,你总是可以隐藏它

斯威夫特:

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

IOS11不推荐使用自动调整 ScrollViewInsets (已被接受的解决方案不再有效)使用:

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

这就是如何通过 Storyboard (iOS 11和 Xcode 9.1)轻松修复它的方法:

选择表格视图 > 大小检查器 > 内容插入: 从不

尝试设置 tableFooterView TableFooterView = UIView (框架: CGRect (x: 0,y: 0,宽度: 0,高度: CGFloat.leastNonzeroMagnitude))

      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)