iOS11上的程序化beginRefreshing()在largeTitles模式下存在问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS11上的程序化beginRefreshing()在largeTitles模式下存在问题相关的知识,希望对你有一定的参考价值。

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

我们正在尝试使用新的ios11大型游戏和提升的搜索栏/ refreshcontrol。我们似乎发现了一个问题,导航堆栈的根viewController显示了一个小的显示问题(问题A)但是一旦另一个viewcontroller被推到导航堆栈上,显示就变得疯狂了(问题B):

Problem

注意事项:

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

当我们以编程方式在viewDidLoad中执行“pull to refresh”时,这种奇怪的行为似乎只是一个问题,这样用户可以在进入屏幕时看到数据正在加载。如果我们删除调用refreshControl?.beginRefreshing()的行,则显示是干净的。我在一个样本香草应用程序中重新创建了这个问题。这是显示问题的整个viewcontroller:

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.
    }
}

这是故事板。它只是一个包含在navigationController中的vanilla tableviewcontroller。 3个静态单元格,第二个静态单元格遍历同一控制器类型的另一个实例。

StoryBoard

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

答案

首先,表视图在导航栏下方向上延伸并且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已经实现了大型游戏并在导航栏中显示了刷新控制,而没有考虑效果或处理由此产生的错误。

以上是关于iOS11上的程序化beginRefreshing()在largeTitles模式下存在问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 beginRefreshing 以编程方式在导航栏上显示大标题

编程 .beginRefresh() 不刷新 UITableView 中的数据

UIRefreshControl - 当 UITableViewController 在 UINavigationController 中时,beginRefreshing 不起作用

UIRefreshControl - 当UITableViewController在UINavigationController中时,beginRefreshing无效

iOS 11 上的静默推送未发送到应用程序

使用 AddressBook 框架时,iOS 11 上的应用程序崩溃?