首选大标题和RefreshControl不能正常工作

时间:2018-06-05 20:02:44

标签: swift xcode uitableview uinavigationbar uirefreshcontrol

我正在使用此tutorial来实现RefreshControl的pull-to-refresh行为。我使用的是Navigation Bar。使用普通标题时,一切都很好。但是,当使用“首选大标题”时,它无法正常工作,您可以在以下视频中看到。谁知道为什么?视频之间唯一的变化是故事板检查“首选大标题”。

With "Prefer big titles" With normal title

11 个答案:

答案 0 :(得分:8)

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

我意识到,将表视图的顶部约束从安全区域更改为 superview 可以修复该奇怪的旋转错误。

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

if using storyboard

答案 1 :(得分:3)

最后对我有用的是:

  • 为了修复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)
    

答案 2 :(得分:3)

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

答案 3 :(得分:1)

我遇到了同样的问题。在调用其他API之前,请调用refreshControl endRefreshing。

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

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

答案 4 :(得分:1)

对我而言,唯一可行的解​​决方案是将Bruno's suggestion与以下代码行结合起来:

tableView.contentInsetAdjustmentBehavior = .always

答案 5 :(得分:0)

似乎有很多不同的原因可能导致这种情况发生,对我而言,我在ViewController中嵌入了TableView。 我将表格视图的顶部布局指南设置为超级视图。毕竟,在我将RefreshControl结束编辑包装在延迟的块中之前,一切仍然没有:

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

答案 6 :(得分:0)

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

但是我不想使用XIB。为了使用AutoLayout通过代码实现此目的,我付出了很多努力。

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

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

答案 7 :(得分:0)

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

override func loadView() {
    view = customView
}

其中customView是UITableView或UICollectionView

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

tableView.backgroundView = refreshControl

答案 10 :(得分:0)

简短回答

我通过延迟对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调用,因此这意味着整个“从上到下刷新”过程的速度不如没有延迟的情况快。