自iOS 11以来,RefreshControl刷新后的UINavigationbar粘性问题

6

navbar stays big

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

enter image description here

RefreshControl 是通过 viewDidLoad 添加的:

self.refreshControl = [RefreshControl new];

我已经尝试过以下几种方法:

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

有人知道是什么原因导致了这个问题吗?就像我说的,我甚至不确定这到底是在什么时候发生的,什么时候没有发生...

5个回答

6

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

目前我使用了一个极其不规范的Hack方法,灵感来源于 Exception 的回答:

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

1
肯定是苹果的一个错误。除了下面的解决方法,我无法让它正常工作。
tableView.reloadData {
    // Slightly scroll up, moving the navigation bar back to place
    self.tableView.setContentOffset(CGPoint(x: 0, y: -0.3), animated: false)
}

注意:必须在tableView重新加载后且没有动画的情况下执行。


0

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

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

0
看起来这是苹果的一个bug。 试试这个
tableView.refreshControl?.endRefreshing() //因为iOS11中存在一个留下空占位符的bug navigationController?.navigationBar.setNeedsLayout() navigationController?.navigationBar.layoutIfNeeded()
还可以尝试一下
navigationController?.navigationBar.appearance().isTranslucent = true

0
在我的情况下,问题是我将tableView.tableFooterView设置为nil,并使用tableView.reloadData()。所以我开始隐藏tableView.tableFooterView而不是将该视图设置为nil,问题就解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接