繁体   English   中英

iOS 11 大标题导航栏不折叠

[英]iOS 11 large-title navigation bar not collapsing

苹果公司在 Cocoa Touch WWDC中的新功能视频中表示,新的大标题导航栏会神奇地钩入底层视图控制器的顶级滚动视图,并在上下滚动时自动折叠/展开自身。 (“神奇地”,他可能是指他们未能以可用的方式将此功能修补到已经令人尴尬的UINavigationController - UINavigationBar - UINavigationitem API 中,因此他们不得不在幕后求助于一些启发式选择的滚动视图)

即使我已经准备好,如果我偏离基本的UINavigationController + UITableView / UICollectionView设置,这种“自动”折叠/展开将不起作用,但似乎即使在这种最简单的情况下,它也无法按预期工作。

这是我所拥有的:

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

故事板

没有代码,只有故事板。

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

坚持大标题

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

返回导航后交互式折叠工作

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

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

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

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

在此处输入图片说明

好消息! 我刚刚发现,如果我在情节提要上将“大标题”设置为“从不” ,然后通过代码设置它,则它可以工作:

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

当导航项通过界面生成器设置largeTitleDisplayMode时,似乎 Apple 忘记处理这种情况。

因此,在他们解决此问题之前,将故事板上的“大标题”保留为“从不” ,并通过viewDidLoad代码设置它们。

您只需要对第一个视图控制器执行此操作。 随后的视图控制器尊重故事板中的值。

或者不要更改故事板中的任何内容,而是执行以下操作:

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

不管是什么语言!

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

由于我无法发表评论,我将在这里分享我发布的答案

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

我基本上在这个站点上找到了一种解决方法,如果 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
    }

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

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

解决方案:在loadView()设置您的视图(包括 navigationController 和 tableView loadView()不是在viewDidLoad()

确保addSubview(tableView)放在其他人之前addSuview(someview)

@TamasZahola @mohamede1945

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

navigationController?.navigationBar.prefersLargeTitles = true

这是一个奇怪的错误。 修复方法是关闭故事板中的 prefersLargeTitles 并在导航控制器的根 vc 的 viewDidLoad 中设置它:

navigationController?.navigationBar.prefersLargeTitles = true

其容器的 TableView 应该位于 ViewController 视图层次结构的顶部(屏幕截图上的 RootView)。 否则它不会工作。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM