【问题标题】:Set UITableView content inset permanently永久设置 UITableView 内容插入
【发布时间】:2014-03-28 01:46:57
【问题描述】:

在我的应用程序中,UINavigationBar 下有一个 UISearchBar,因此用户始终可以看到它。在这种情况下,我必须将contentInset 设置为额外的 44 像素,这样UIScrollView 将在UISearchBar 下滚动(就像在 Contacts.app 中一样)。静态UITableView 不会有问题,但在我的情况下,我必须重新加载它的内容,切换到UISearchDisplayControlleretc。所以当我打电话时:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这可能是我的某种错误,因为我弄乱了自动布局和情节提要,但我找到了答案。

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

    必须取消选中它,以便在任何更改后不会设置默认的contentInset。 之后,它只是在viewDidLoad 中添加一条线:

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

    iOS 11、Xcode 9 更新

    如果涉及到 iOS 11Xcode 9,之前的解决方案似乎不再正确。 automaticallyAdjustsScrollViewInsets 已被弃用,现在要达到类似的效果,您必须转到 Size Inspector 在那里您可以找到:
    此外,您可以在代码中实现相同的效果:

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

    【讨论】:

    • 天才!我认为默认情况下应该取消选中这个“小家伙”。现在情节提要中的内容(uitableview&uiscrollview)与我在 iPhone 中的内容相匹配。
    • 这几个月来一直困扰着我,但还不足以查找它。谢谢
    • 谢谢!当检查“小家伙”时,在ViewDidLayoutsubviews上使用ContentInsets(在ViewWillappear和ViewDideapear之间)中使用ContentInsets。 span>
    • Swift 2.3 中的等价物是什么?
    • @WilliamGP 它是属性检查器中的“调整滚动视图插图”复选标记?
    【解决方案2】:

    在斯威夫特中:

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

    【讨论】:

    • 为什么不打电话给super.viewDidLayoutSubviews()
    • 不需要它,因为 viewDidLayoutSubviews 的默认实现什么都不做。 (来源:developer.apple.com/library/ios/documentation/UIKit/Reference/…
    • 这是真的约翰内克。如果您自己的应用程序发生架构更改或 Apple 对 UIKit 进行更改,最好调用 super。
    【解决方案3】:

    automaticallyAdjustsScrollViewInsets 在 iOS11 中已弃用(并且已接受的解决方案不再有效)。使用:

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

    【讨论】:

    • 如果能够将 contentInsets 绑定到选定的安全区域(即不是全部),那就太好了
    【解决方案4】:

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

    【讨论】:

    • 这不起作用。当我拉动刷新内容时,插图正在恢复为出厂设置。
    • 也许可以尝试将该行移至viewDidLayoutSubviews
    • 您也可以像这样[tableView setTableHeaderView:yourSearchBar]; 将搜索栏添加为表格的标题
    • 但搜索栏必须始终对用户可见。没关系,我找到了解决方案。阅读我的答案。
    【解决方案5】:

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

    使用这种方法,如果搜索栏为空,您始终可以隐藏搜索栏

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        尝试设置 tableFooterView tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNonzeroMagnitude))

        【讨论】:

          【解决方案8】:
                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)
          

          【讨论】:

            猜你喜欢
            • 2017-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-20
            • 2014-01-25
            • 1970-01-01
            • 1970-01-01
            • 2012-02-06
            相关资源
            最近更新 更多