自 iOS 11 起刷新 RefreshControl 后的粘性 UINavigationbar

Posted

技术标签:

【中文标题】自 iOS 11 起刷新 RefreshControl 后的粘性 UINavigationbar【英文标题】:Sticky UINavigationbar after RefreshControl refreshed since iOS 11 【发布时间】:2017-11-29 13:16:44 【问题描述】:

我们有一个使用两个导航层次结构的模块化应用程序,因此两个堆叠的导航栏...... 有时,当拉动刷新控件时,导航栏会保持很大并且在完成刷新后不会回落到正常大小。我只能猜测,在这种情况下它会退回而它不会…… 可视调试器显示,使用此空间的视图是_UINavigationBarLargeTitleView。在viewDidLoad 中,self.navigationController.navigationBar.prefersLargeTitles 设置为NO

viewDidLoad中添加RefreshControl通过:

self.refreshControl = [RefreshControl new];

我已经尝试过的一些事情:

将 tableViews contentOffset 设置为 (0,-1)。 将 prefersLargeTitles 设置为 YES,然后设置为 NO。 设置 UINavigationControllers self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; 记录 UIRefreshControl 的不同状态:粘滞视图和工作视图产生相同的记录。

有谁知道是什么导致了这个问题?正如我所说,我什至不确定这到底是什么时候发生的,什么时候不是……

【问题讨论】:

【参考方案1】:

这个问题似乎只发生在navigationBar.isTranslucent == false 时。我需要这个设置来获得真正的 100% 黑色导航栏。

暂时我使用这个非常肮脏的hack,灵感来自异常的答案:

self.refreshControl?.endRefreshing()
if #available(ios 11.0, *) 
    self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.navigationBar.isTranslucent = false

【讨论】:

【参考方案2】:

绝对是来自 Apple 的错误。除了以下解决方法之外,无法使其工作。

tableView.reloadData 
    // Slightly scroll up, moving the navigation bar back to place
    self.tableView.setContentOffset(CGPoint(x: 0, y: -0.3), animated: false)

注意:必须在 tableView 重新加载并且没有动画之后。

【讨论】:

【参考方案3】:

看起来这是来自 Apple 的错误。 试试这个

tableView.refreshControl?.endRefreshing() //Because of a bug in iOS11 that leaves empty placeholder for refresh control navigationController?.navigationBar.setNeedsLayout() navigationController?.navigationBar.layoutIfNeeded()

也试试

navigationController?.navigationBar.appearance().isTranslucent = true

【讨论】:

【参考方案4】:

另外,如果你有变形的标题或第一个单元格,你可以添加这一行:

tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

它应该有助于在正常状态下返回标题或单元格。完整的代码可能如下所示:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) 
   self.navigationController?.navigationBar.isTranslucent = true
   if self.refreshControl!.isRefreshing 
       self.refreshControl!.endRefreshing()
   
   self.navigationController?.navigationBar.isTranslucent = false
   self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

【讨论】:

以上是关于自 iOS 11 起刷新 RefreshControl 后的粘性 UINavigationbar的主要内容,如果未能解决你的问题,请参考以下文章

自定义单元格的刷新控制问题 - Swift 4 IOS 11

如何从 iOS File App(自 iOS 11 起)使用 iOS App 打开文本文件?

RefreshControl 不隐藏

嵌套表上的刷新控制不起作用(ios 开发)

设置 UIBarButtonItem 动画在 iOS 11 上不起作用

JQuery Mobile:选择菜单刷新 true 在 iOS 上不起作用