iOS 11 上的编程式 begin Refreshing() 在使用 largeTitles 模式时存在问题

2024-01-29

我们发现 UIKit 中似乎有一个错误,但想在这里发帖看看其他人是否也遇到这个问题或找到解决方案。

我们正在尝试使用新的 iOS11 大标题和提升的搜索栏/刷新控件。我们似乎发现了一个问题,导航堆栈的根视图控制器显示了一个小显示问题(问题 A),但是一旦将另一个视图控制器推入导航堆栈,显示就会变得疯狂(问题 B):

注意事项:

  1. 堆栈中第二个 VC 的问题比第一个更严重
  2. 刷新控件不是绿色,代码将其设置为您第一次在每个屏幕上看到它时
  3. 当您拉动刷新时,refreshControl 会向下滑动,它不应该这样做

当我们以编程方式在 viewDidLoad 中执行“拉动刷新”以便用户在进入屏幕时可以看到数据正在加载时,这种奇怪的行为似乎只会成为问题。如果我们删除调用的行refreshControl?.beginRefreshing()显示屏很干净。我在示例普通应用程序中重现了这个问题。这是显示问题的整个视图控制器:

import UIKit

class ViewController: UITableViewController {
    var tableHeaderSearchController: UISearchController!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.navigationController?.navigationBar.prefersLargeTitles = true
        self.navigationController?.navigationItem.largeTitleDisplayMode = .always

        tableHeaderSearchController = UISearchController(searchResultsController: UITableViewController())
        navigationItem.searchController = tableHeaderSearchController

        refreshControl?.tintColor = UIColor.green
        refreshControl?.backgroundColor = UIColor.clear
        refreshControl?.attributedTitle = NSAttributedString(string: "Loading Stuff...", attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17)])
        refreshControl?.addTarget(self, action: #selector(refreshPulled), for: .valueChanged)

        // Commenting out these 2 lines makes it work fine but you can't see the initial refresh spinner
        refreshControl?.beginRefreshing()
        refreshPulled()
    }

    @objc func refreshPulled() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) { [refreshControl] in
            refreshControl?.endRefreshing()
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

这是故事板。它只是一个包裹在导航控制器中的普通表视图控制器。 3 个静态单元格,第二个静态单元格遍历到相同控制器类型的另一个实例。

任何想法将不胜感激。我们真的很想采用新的外观,但这些东西让我们很难做到这一点。


首先,表格视图在导航栏下方向上延伸是绝对重要的,这就是 iOS 11 偏移行为的正确性:

    self.edgesForExtendedLayout = .all
    self.tableView.contentInsetAdjustmentBehavior = .always

其次,手动刷新时滚动显示刷新控件取决于您,并且计算金额并不简单:

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

The bar still在刷新期间仍然太大,但我不知道对此可以采取什么措施。基本上,苹果已经实现了大标题并在导航栏中显示了刷新控件,而没有考虑效果或处理由此产生的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 11 上的编程式 begin Refreshing() 在使用 largeTitles 模式时存在问题 的相关文章

随机推荐