首页 文章

iOS 11大 Headers 导航栏没有崩溃

提问于
浏览
39

What's new in Cocoa Touch WWDC video said中的Apple家伙,新的大 Headers 导航栏将神奇地挂钩到底层视图控制器的顶级滚动视图,并在向上和向下滚动时自动折叠/展开 . (并且由于"magically",他可能意味着他们没有将这个功能修补到已经令人尴尬的API中,因此他们不得不诉诸于幕后的一些启发式选择的滚动视图)

即使我已经准备好如果我从基本设置中略微偏离这个"automatic"崩溃/扩展也不会起作用,看起来即使在这个最简单的情况下它也不能按预期工作 .

这就是我所拥有的:

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

storyboard

没有代码,只有故事板 .

我检查了"Prefers large titles"的导航栏以激活大型 Headers . 现在,如果我运行应用程序并在表格视图上向上/向下滚动,导航栏保持不变 - 大尺寸;它没有崩溃:

stuck with large title

但是,我've found that if I set the second view controller'的导航项目使用小导航栏(通过将"Large Title"设置为值"Never"),然后如果我打开该页面并导航回来,交互式崩溃会神奇地开始在第一页上工作:

interactive collapse works after back navigation

我在这里遗漏了什么,或者这个功能不能正常工作?这里's the sample project I' m使用: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

5 回答

  • 1

    好消息!我刚想通了如果我在故事板上将"Large Titles"设置为"Never",然后通过代码设置它,那么它可以工作:

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

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

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

    You just need to do that to the first view controller. Subsequent view controllers honor the value in storyboard.

  • 5

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

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

    不管是哪种语言!

    这是因为导航项上的大 Headers 基于先前屏幕导航项 Headers 上的大 Headers 行为来决定是否折叠 .

  • 6

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

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

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

    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
        }
    
  • 23

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

    enter image description here

  • 5

    @TamasZahola @ mohamede1945

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

    navigationController?.navigationBar.prefersLargeTitles = true
    

相关问题