iOS 11大标题导航栏没有崩溃

时间:2017-09-22 20:54:30

标签: ios objective-c uikit ios11

What's new in Cocoa Touch WWDC video said中的Apple家伙,新的大标题导航栏将神奇地挂钩到底层视图控制器的顶级滚动视图,并在向上和向下滚动时自动折叠/展开。 (并且通过“神奇地”,他可能意味着他们无法以可用的方式将此功能修补到已经令人尴尬的UINavigationController - UINavigationBar - UINavigationitem API中,因此他们不得不求助在幕后勾勒出一些启发式选择的滚动视图)

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

这就是我所拥有的:

UITabBarController,其中包含UINavigationController,其中包含UIViewController,其UITableViewview。点击表格中的第一个单元格将推送导航堆栈上的第二个视图控制器:

storyboard

没有代码,只是故事板。

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

stuck with large title

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

interactive collapse works after back navigation

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

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

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

7 个答案:

答案 0 :(得分:23)

好消息!我只是弄明白,如果我在故事板上将"大标题" 设置为" Never" ,然后通过代码设置它,然后它工作:

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

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

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

您只需要对第一个视图控制器执行此操作。后续视图控制器会在故事板中显示该值。

答案 1 :(得分:10)

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

enter image description here

答案 2 :(得分:8)

或者不改变故事板中的任何内容,请执行以下操作:

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

无论用哪种语言!

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

答案 3 :(得分:5)

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

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

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

Example that will NOT work Example that will work

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
    }

答案 4 :(得分:3)

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

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

解决方案:不在loadView()中的viewDidLoad()内设置视图(包括navigationController的东西和tableView)。

答案 5 :(得分:1)

@TamasZahola @ mohamede1945

伙计们我遇到了同样的问题。我能够通过在我的第一个导航控制器视图控制器

上添加以下代码段来解决此问题
navigationController?.navigationBar.prefersLargeTitles = true

答案 6 :(得分:1)

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