自 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];
我已经尝试过的一些事情:
将 tableViewscontentOffset
设置为 (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 打开文本文件?