喜欢大标题和 RefreshControl 效果不佳

Prefer Large Titles and RefreshControl not working well

我正在使用此 tutorial 来实现 RefreshControl 的 pull-to-refresh 行为。我正在使用 Navigation Bar。使用普通标题时一切正常。但是,当使用 "Prefer big titles" 时,它无法正常工作,如您在以下视频中所见。任何人都知道为什么?视频之间的唯一变化是 "Prefer Large Titles" 上的故事板检查。

最后对我有用的是:

  • 为了修复带有大标题的 RefreshControl 进度条消失的错误:

    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)
    

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

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

我意识到将 table 视图顶部约束从 安全区域 更改为 superview 修复了那个奇怪的旋转错误.

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

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

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

使用 XIB 对我有用的唯一解决方案是 Bruno 的解决方案:

但是我不想使用 XIB。为了使用 AutoLayout 通过代码来完成这项工作,我费了很大劲。

我终于找到了有效的解决方案:

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

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

override func loadView() {
    view = customView
}

其中 customView 是 UITableView 或 UICollectionView

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

我遇到过同样的问题。在进一步调用之前先调用 refreshControl endRefreshing API.

refreshControl.addTarget(controller, action: #selector(refreshData(_:)), for: .valueChanged)

@objc func refreshData(_ refreshControl: UIRefreshControl) {
        refreshControl.endRefreshing()
        self.model.loadAPICall {
            self.tableView.reloadData()
        }
    }

对我来说唯一可行的解​​决方案是将 与这行代码相结合:

tableView.contentInsetAdjustmentBehavior = .always

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

tableView.backgroundView = refreshControl

简答

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

长答案

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

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

警告

请注意,由于我们延迟了 API 调用,这意味着整个拉取到刷新过程没有延迟那么快。