iOS 11大标题导航栏不能折叠

Cocoa Touch WWDC新video中的苹果家伙表示 ,新的大标题导航栏将魔法挂钩到底层视图控制器的顶层滚动视图中,并在滚动上下时自动折叠/展开。 (通过“神奇地”,他可能意味着他们没有把这个function修改成已经令人尴尬的UINavigationControllerUINavigationBarUINavigationitem API,所以他们不得不借助一些启发式地select后台的滚动视图)

即使我准备了这个“自动”崩溃/展开将无法工作,如果我偏离了基本的UINavigationController + UITableView / UICollectionView设置丝毫,似乎即使在这种最简单的情况下,它不会如预期的那样工作。

这是我有:

一个包含UINavigationController UITabBarController ,它包含一个UIViewControllerUITableView作为它的view 。 点击表格中的第一个单元格将会推动导航堆栈中的第二个视图控制器:

故事板

没有代码,只是故事板。

我已经勾选了“喜欢大标题”的导航栏来激活大标题。 现在,如果我运行应用程序并向上/向下滚动表格视图,导航栏保持不变 – 大尺寸; 它不会崩溃:

卡住了大标题

但是,我发现,如果我设置第二个视图控制器的导航项目使用小导航栏(通过设置“大标题”值为“从不” ),那么如果我打开该页面并导航回来,交互式崩溃神奇地开始在第一页上工作:

后台导航后交互式崩溃工作

我在这里错过了什么,或者这个function不能正常工作? 这里是我使用的示例项目: https : //github.com/tzahola/iOS-11-Large-Title-Navigation-Bar

顺便说一句,我正在使用官方发布的iOS 11,而不是beta版。

2017-09-23更新:我向苹果发送了一个错误报告,并在openradar.me上打开了一张票: http : //www.openradar.me/radar?id= 5017601935671296

好消息! 我刚刚发现,如果我在故事板上将“大标题”设置为“从不” ,然后通过代码进行设置,那么它将起作用:

 - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic; } 

看起来像苹果公司忘记处理的情况下,导航项目通过Interface Builder设置largeTitleDisplayMode

因此,直到他们解决这个问题,在故事板上留下“大标题”“从不” ,并通过viewDidLoad代码进行设置。

你只需要这样做到第一个视图控制器。 后续的视图控制器在故事板中表示尊重价值。

或者,而不是改变任何故事板,这样做:

 override func viewDidLoad() { super.viewDidLoad() if #available(iOS 11.0, *) { self.navigationItem.largeTitleDisplayMode = .never self.navigationItem.largeTitleDisplayMode = .always } } 

不pipe哪种语言!

这是因为导航项目上的大标题决定是否在前一个屏幕导航项目标题上的大标题行为的基础上崩溃。

@TamasZahola @ mohamede1945

伙计们,我有同样的问题。 我能够通过在我的第一个导航控制器视图控制器上添加以下片段来解决此问题

 navigationController?.navigationBar.prefersLargeTitles = true 

由于我不能评论我会在这里分享我发布的答案

https://stackoverflow.com/a/47493375/8385022

我基本上在这个网站上find了一个解决方法,如果tableView(或者具有滚动的元素)不是视图层次结构中的第一个视图,那么大标题不能自动隐藏。

例子,将无法正常工作的 例子

https://markusbodner.com/2017/10/08/fix-large-navigation-bar-title-not-hiding-on-scroll-in-ios-11/

我在视图上添加willAppear:

  if #available(iOS 11.0, *) { navigationController?.navigationBar.prefersLargeTitles = true } else { // Fallback on earlier versions }