iOS 11 large-title 导航栏没有折叠

iOS 11 large-title navigation bar not collapsing

What's new in Cocoa Touch WWDC video said 中的 Apple 家伙,新的 large-title 导航栏将神奇地挂接到底层视图控制器的 top-level 滚动视图和 collapse/expand 本身上下滚动时。 (并且 "magically",他的意思可能是他们未能以一种可用的方式将此功能猴子修补到已经令人尴尬的 UINavigationController-UINavigationBar-UINavigationitem API 中,因此他们有在幕后诉诸于一些启发式选择的滚动视图)

尽管我已经准备好,如果我稍微偏离基本 UINavigationController + UITableView/[=17=,这个 "automatic" collapse/expand 将无法工作] 设置,似乎即使在这种最简单的情况下,它也无法按预期工作。

这是我的:

一个 UITabBarController,它包含一个 UINavigationController,它包含一个 UIViewController,它有一个 UITableView 作为它的 view。点击 table 中的第一个单元格将在导航堆栈上推送第二个视图控制器:

没有代码,只有故事板。

我已经检查了 "Prefers large titles" 导航栏以激活大标题。现在,如果我 运行 应用程序并在 table 视图上滚动 up/down,导航栏保持不变 - 大 - 尺寸;它不会崩溃:

但是,我发现如果我将第二个视图控制器的导航项设置为使用小导航栏(通过将 "Large Title" 设置为值 "Never"),然后如果我打开该页面并向后导航,交互式折叠会神奇地在第一页开始工作:

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

顺便说一句,我使用的是正式发布的 iOS 11,而不是测试版。

2017-09-23 更新:我已经向 Apple 发送了错误报告,并在 openradar.me 上开了一个工单:http://www.openradar.me/radar?id=5017601935671296

好消息!我刚刚发现,如果我在故事板上将 "Large Titles" 设置为 "Never",然后通过代码,然后就可以了:

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

当导航项通过 Interface Builder 设置 largeTitleDisplayMode 时,Apple 似乎忘记处理这种情况。

因此,在他们解决此问题之前,请将 "Large Titles" 保留为故事板中的 "Never",并设置它们通过 viewDidLoad 中的代码。

您只需要对第一个视图控制器执行此操作。后续视图控制器遵循情节提要中的值。

或者不要更改故事板中的任何内容,而是这样做:

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

无论哪种语言!

这是因为导航项上的大标题根据前一屏幕导航项标题上的大标题行为决定是否折叠。

@TamasZahola @mohamede1945

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

navigationController?.navigationBar.prefersLargeTitles = true

如果除了 tableView 之外还有任何其他视图,还要确保 tableView 位于该视图的顶部,就在安全区域下方:

2020 年,iOS 13.0,这里从未提到过。为此,我真的花了一两个小时。

问题:使用 Snapkit(一种自动布局框架)以编程方式进行布局时,大标题不会折叠

解决方案:在 loadView() 中而不是在 viewDidLoad().

中设置你的视图(包括 navigationController 东西和 tableView)

确保 addSubview(tableView) 排在其他 addSuview(someview)

之前

这是一个奇怪的错误。解决方法是在情节提要中关闭 prefersLargeTitles,并在导航控制器的根 vc:

的 viewDidLoad 中进行设置
navigationController?.navigationBar.prefersLargeTitles = true

其容器的 TableView 应位于 ViewController 视图层次结构的顶部(屏幕截图中的 RootView)。不然不行。