在具有大标题的导航控制器中时,UIRefreshControl 未横向显示

UIRefreshControl not showing in landscape when in a navigation controller with large titles

我有一个普通的 UITableViewController 嵌入 UINavigationController 更喜欢大标题 。我在我的 table 视图控制器中添加了一个刷新控件。

在 iOS 11 的 iPhone 上,如果我以纵向模式启动我的应用程序,切换到横向并开始刷新 table 视图, 刷新控件没有出现。刷新发生,但控件不存在。它甚至不在视图层次结构中:

请注意,如果我处于纵向模式, 在 iPhone 上工作,并且在每个方向上都在 iPad 上工作。 它也适用于 iOS 10 每个设备和每个方向并且 也适用于 iOS 11 如果我禁用大标题,所以它显然与大标题有关。

这是 iOS 10 上同一件事的屏幕截图:

I made a sample project for this. 不涉及任何代码,这是 Interface Builder 中的整个设置:

当我尝试使用带有嵌入式 UITableViewUIScrollView 的简单 UIViewController 时,同样的事情发生了。

我很确定这是一个错误。如何让刷新控件在横向 iPhone 上可见?

这可以清楚地描述为错误。它很容易复制。您的描述似乎很正确;一旦你以纵向显示刷新控件然后旋转到横向,刷新控件甚至不在横向界面中(如果你给它一个背景颜色就很容易看到)。

不过,总的来说,这并不奇怪。有很多与大标题相关的错误;苹果显然没有仔细考虑过这个功能。

我们通过在每次旋转时重新创建刷新控件来解决此问题。它也在 viewDidLoad() 中被调用。

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    if traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass {
        tableView.refreshControl = UIRefreshControl() // !!!
        tableView.refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
    }
}

@objc func didPullToRefresh() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
        tableView.refreshControl.endRefreshing()
    }
    // ...
}