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

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

swift - iOS11 上的程序化 beginRefreshing() 在 largeTitles 模式下有问题-LMLPHP

注意事项:

  • 问题在堆栈中的第二个 VC 而不是第一个
  • 上更严重
  • refreshControl 不是绿色,代码将其设置为您在每个场景中第一次看到它时的颜色
  • 当您拉动刷新时,refreshControl 会向下滑动,它不应该这样做

  • 这种奇怪的行为似乎只有当我们在 viewDidLoad 中以编程方式执行“拉动刷新”时才会出现问题,以便用户在进入屏幕时可以看到数据正在加载。如果我们删除调用 refreshControl?.beginRefreshing() 的行,显示是干净的。我在一个示例 Vanilla 应用程序中重新创建了这个问题。这是显示问题的整个 View Controller :
    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.
        }
    }
    

    这是 Storyboard。它只是一个包裹在导航 Controller 中的普通 tableviewcontroller。 3 个静态单元格,第 2 个单元格遍历到相同 Controller 类型的另一个实例。

    swift - iOS11 上的程序化 beginRefreshing() 在 largeTitles 模式下有问题-LMLPHP

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

    最佳答案

    首先,表格 View 在导航栏下方向上延伸是绝对重要的,这是 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()
    

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

    关于swift - iOS11 上的程序化 beginRefreshing() 在 largeTitles 模式下有问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48347215/

    10-11 19:45
    查看更多