【问题标题】:Prefer Large Titles and RefreshControl not working well喜欢大标题和 RefreshControl 不能正常工作
【发布时间】:2018-11-15 09:53:41
【问题描述】:

我正在使用这个tutorial 来实现RefreshControl 的拉动刷新行为。我正在使用Navigation Bar。使用普通标题时,一切正常。但是,当使用“首选大标题”时,它无法正常工作,正如您在以下视频中看到的那样。有谁知道为什么?视频之间的唯一变化是“首选大标题”的情节提要检查。

【问题讨论】:

标签: swift xcode uitableview uinavigationbar uirefreshcontrol


【解决方案1】:

简答

我通过延迟调用 API 直到我的集合视图结束减速来解决此问题

长答案

我注意到,当集合视图仍在向上移动到其原始位置时,刷新控件结束刷新时会发生此问题。因此,我延迟进行 API 调用,直到我的集合视图停止移动,也就是结束减速。这是一步一步的:

  1. 关注Bruno's suggestion
  2. 如果将导航栏的半透明值设置为 false (navigationBar.isTranslucent = false),则必须在视图控制器上设置 extendedLayoutIncludesOpaqueBars = true。否则,请跳过。
  3. 延迟 API 调用。因为我使用的是RxSwift,所以我是这样做的。
collectionView.rx.didEndDecelerating
    .map { [unowned self] _ in self.refreshControl.isRefreshing }
    .filter { $0 == true }
    .subscribe(onNext: { _ in
        // make api call
    })
    .disposed(by: disposeBag)
  1. API 完成后,调用
refreshControl.endRefreshing()

警告

请注意,由于我们延迟 API 调用,这意味着整个拉动刷新过程不如没有延迟的情况下完成的那么快。

【讨论】:

    【解决方案2】:

    我长期面临同样的问题,对我来说唯一可行的解​​决方案是向 tableview 的背景视图添加刷新控制。

    tableView.backgroundView = refreshControl
    

    【讨论】:

      【解决方案3】:

      对我来说唯一可行的解​​决方案是将Bruno's suggestion 与这行代码结合起来:

      tableView.contentInsetAdjustmentBehavior = .always

      【讨论】:

      • 谢谢!如果没有这行代码,Bruno 的建议会导致UIScrollView.scrollsToTop 出现问题。 (注意:您也可以在 IB 的 Size Inspector 窗格中进行设置。)
      【解决方案4】:

      我也遇到过同样的问题。在调用更多 API 之前调用 refreshControl endRefreshing。

      refreshControl.addTarget(controller, action: #selector(refreshData(_:)), for: .valueChanged)
      
      @objc func refreshData(_ refreshControl: UIRefreshControl) {
              refreshControl.endRefreshing()
              self.model.loadAPICall {
                  self.tableView.reloadData()
              }
          }
      

      【讨论】:

        【解决方案5】:

        我也遇到了这个问题,我通过在 stackView 中嵌入我的 scrollView(或 tableView \ collectionView)来修复它,重要的是这个 stackView 的顶部约束不会附加到 safeArea 视图(所有其他约束都可以)。顶部约束应该连接到它的超级视图或其他视图。

        【讨论】:

          【解决方案6】:

          如果在 UIViewController 层次结构中添加 tableview 或滚动视图作为根视图(如 UITableViewController 中),问题可以解决

          override func loadView() {
              view = customView
          }
          

          其中 customView 是 UITableView 或 UICollectionView

          【讨论】:

            【解决方案7】:

            使用 XIB 对我有用的唯一解决方案是 Bruno 的解决方案: https://stackoverflow.com/a/54629641/2178888

            但是我不想使用 XIB。我很努力地尝试使用 AutoLayout 通过代码来完成这项工作。

            我终于找到了一个可行的解决方案:

                override func loadView() {
                    super.loadView()
                    let tableView = UITableView()
                    //configure tableView
                    self.view = tableView
                }
            

            【讨论】:

              【解决方案8】:

              似乎有很多不同的原因可能导致这种情况发生,对我来说,我在 ViewController 中嵌入了一个 TableView。 我将tableview的顶部布局指南设置为带有0的superview。在我将 RefreshControl 结束编辑包装在延迟块中之前,所有这些仍然一无所获:

              DispatchQueue.main.async {
                 if self.refreshControl.isRefreshing {
                     DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
                          self.refreshControl.endRefreshing()
                     })
                 }
              }
              

              【讨论】:

              • 可悲的是,我不得不采用这个确实有点笨拙的解决方案。我确实成功地将 + 1.0 降低到 + 0.2
              【解决方案9】:

              我遇到了同样的问题,其他答案都对我有用。

              我意识到将表格视图顶部约束从 safe area 更改为 superview 修复了这个奇怪的旋转错误。

              另外,请确保此约束的常量值为 0 ?。

              【讨论】:

              • 从早上起就一直在苦苦挣扎,这是唯一对我有用的解决方案(iOS 12.1)。谢谢!
              • 也为我工作,有 1 周的时间找到解决方案。谢谢!
              • 谢谢伙计,它也对我有用!我有这个错误大约一年
              • 结合它:tableView.contentInsetAdjustmentBehavior = .always
              【解决方案10】:

              如果您使用的是tableView.tableHeaderView = refreshControltableView.addSubView(refreshControl),您应该尝试使用tableView.refreshControl = refreshControl

              【讨论】:

                【解决方案11】:

                最后对我有用的是:

                • 为了修复RefreshControl进度条大标题消失的bug:

                  self.extendedLayoutIncludesOpaqueBars = true
                  
                • 为了修复refreshcontrol.endRefreshing()之后的列表偏移:

                  let top = self.tableView.adjustedContentInset.top
                  let y = self.refreshControl!.frame.maxY + top
                  self.tableView.setContentOffset(CGPoint(x: 0, y: -y), animated:true)
                  

                【讨论】:

                • 如果您有不透明的标签栏并且 self.extendedLayoutIncludesOpaqueBars = true 使所有内容都在标签栏下并且您不希望这种行为,那么您可以添加 'self.edgesForExtendedLayout = UIRectEdge.top'
                • 第一部分帮助了我!
                • 在修复列表偏移量之前检查是否缺少 tableView.reloadData() 调用,例如如果你更新 tableHeaderView,你应该在它之后立即调用 reloadData()。
                猜你喜欢
                • 2021-04-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-02-13
                • 2013-10-23
                • 2021-07-18
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多