【问题标题】:iOS 11 large-title navigation bar not collapsingiOS 11 大标题导航栏不折叠
【发布时间】:2018-03-04 12:36:28
【问题描述】:

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

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

这是我所拥有的:

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

没有代码,只有故事板。

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

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

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

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

2017 年 9 月 23 日更新:我已向 Apple 发送错误报告,并在 openradar.me 上打开了一张票:http://www.openradar.me/radar?id=5017601935671296

【问题讨论】:

  • 我正在经历同样的事情。我的直觉告诉我这是一个错误????
  • @Michael 在下面查看我的答案!
  • @TamásZahola 谢谢。我今晚再试一次
  • 科学我无法评论我会分享我发布的答案stackoverflow.com/a/47493375/8385022

标签: ios objective-c uikit ios11


【解决方案1】:

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

【讨论】:

  • 谢谢!这对我有帮助!
  • 这对我也有帮助,谢谢!
  • 谢谢!这有效!
【解决方案2】:

好消息!我刚刚发现,如果我在情节提要上将 "Large Titles" 设置为 "Never",然后通过代码进行设置,那么它可以工作:

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

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

因此,在他们解决此问题之前,请将 "Large Titles" 在情节提要上保留为 "Never",并通过 viewDidLoad 中的代码进行设置。

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

【讨论】:

  • 能否请您具体说明,我在哪里可以找到故事板上的“大标题”?我能找到的只是导航栏上的“首选大标题”复选标记选项。上面的代码sn-p是在哪个控制器上调用的,在列表还是在详情页?
  • @gklka 你应该选择导航控制器包含的视图控制器上的导航项!
  • 正如@TamásZahola 解释的那样。将该代码(并在 IB 中禁用“自动”/设置为“从不”)添加到将由导航控制器加载的第一个(根?)视图控制器是 非常 重要的。如果你在后续的视图控制器上这样做,它不会有任何效果!
【解决方案3】:

或者,不要更改情节提要中的任何内容,而是这样做:

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

无论哪种语言!

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

【讨论】:

  • 补充一点,documentation 声明 .always 的意思是:“总是显示一个大标题”(然后可能会折叠),而 .automatic 的意思是:“继承显示模式从上一个导航项”。因此,如果主视图控制器是 .always 并且子视图控制器都是 .automatic,那么它应该都充当 .always。
【解决方案4】:

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

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

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

【讨论】:

  • 遇到了类似的问题。使用 SnapKit 来约束带有 make.directionalEdges.equalTo(superview.safeAreaLayoutGuide).inset(insets) 的表格视图意味着动画被破坏,使用 make.directionalEdges.equalToSuperview().inset(insets) 很好。奇怪。
【解决方案5】:

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

【讨论】:

  • 很好的答案,但我必须问为什么?!你有这方面的文档参考吗?
【解决方案6】:

@TamasZahola @mohamede1945

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

navigationController?.navigationBar.prefersLargeTitles = true

【讨论】:

  • 在哪里?你在使用故事板吗?
  • 是的,我使用的是故事板。
【解决方案7】:

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

navigationController?.navigationBar.prefersLargeTitles = true

【讨论】:

    【解决方案8】:

    其容器的 TableView 应该位于 ViewController 的视图层次结构的顶部(屏幕截图上的 RootView)。否则将无法正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2013-12-17
      • 2018-03-03
      • 2018-04-29
      相关资源
      最近更新 更多