永久设置UITableView内容

时间:2014-02-25 16:54:27

标签: ios objective-c uitableview uiscrollview pull-to-refresh

在我的应用中,我在UISearchBar下面有一个UINavigationBar,因此用户始终可以看到它。在这种情况下,我必须将contentInset设置为额外的44px,以便UIScrollView将在UISearchBar 下滚动(与Contacts.app完全相同)。静态UITableView没有问题,但在我的情况下,我必须重新加载它的内容,切换到UISearchDisplayController等。所以当我打电话时:

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

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

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

8 个答案:

答案 0 :(得分:183)

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

你必须在 View Controller的属性检查器中照顾这个小家伙 asvi

必须取消选中,以便在更改后不会设置默认contentInset。 之后,只需在viewDidLoad添加一行代码:

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

iOS 11,Xcode 9更新

如果涉及 iOS 11 Xcode 9 ,以前的解决方案看起来不再正确。 automaticallyAdjustsScrollViewInsets已被弃用,目前为了达到类似的效果,您必须转到尺寸检查器,您可以在其中找到: enter image description here
此外,您可以在代码中实现相同的目标:

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)