在 iOS 11 中使用增加的导航栏标题

Posted

技术标签:

【中文标题】在 iOS 11 中使用增加的导航栏标题【英文标题】:Use the increased navigation-bar title in iOS 11 【发布时间】:2017-11-08 14:26:30 【问题描述】:

ios 11 Beta 1 为几乎所有系统应用程序使用增加的导航栏标题(它在 iOS 10 和音乐应用程序中开始这样做)。我想知道 Apple 是否在 iOS 11 中为此提供了一个公共 API,或者它现在是否会保持私有。

行为是标题的字体大小增加,左对齐,并且一旦用户向下滚动,就会移动到导航栏。我在此处的 Messages 应用中附加了一些显示此行为的屏幕:

虽然到目前为止我在UINavigationControllerUINavigationBar 中找不到任何参考,但也许有人知道更多细节!

【问题讨论】:

在文档中:prefersLargeTitles Big NavigationBar,工具栏标题在 iOS 11 中可用,您也可以在您的应用中使用它。 看来必须在代码中完成。 Interface Builder 中的大标题选择器没有任何作用。 【参考方案1】:

对 iOS 11 的 UINavigationBar API 所做的唯一更改是 prefersLargeTitles

此处的文档:https://developer.apple.com/documentation/uikit/uinavigationbar/

您只需稍作改动即可对自己的应用执行此操作:在 IB 中为您的导航栏选中“Prefers Large Titles”,或者如果您更喜欢使用以下代码在代码中执行此操作:

navigationController?.navigationBar.prefersLargeTitles = true

如果您需要更改大标题的文本属性,您需要使用UINavigationBar 上的新largeTitleTextAttributes 属性:

UINavigationBar.appearance().largeTitleTextAttributes = [
    NSAttributedString.Key.foregroundColor: UIColor.black
]

【讨论】:

我知道这是一个完全不同的问题,但我不确定是否值得发布一个新问题。你找到改变大标题文本颜色(前景色)的方法了吗? 我认为它仍然是一个错误....请检查openradar.me/32658968 更改大标题属性的属性是largeTitleTextAttributes,此处回答:***.com/a/45020883/106703。我想这是有道理的,所以大而常规的标题可以独立设置样式。 @DanielWood 你能在同一个答案中编辑它吗.. 它对其他用户也有帮助 只是为了更新答案:NSForegroundColorAttributeName 已重命名为 NSAttributedStringKey.foregroundColor【参考方案2】:

UINavigationBar 有一个 prefersLargeTitles: Bool 属性。 Docs here.

class UINavigationBar 
   var prefersLargeTitles: Bool

UINavigationItem 有一个 largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode 属性。 Docs here.

class UINavigationItem 
   var largeTitleDisplayMode: LargeTitleDisplayMode

这两者都可以在 Interface Builder 中进行修改。

要启用此行为,请将 navigationController.navigationBar.prefersLargeTitles 设置为 true。然后您可以通过设置navigationItem.largeTitleDisplayMode 来控制导航控制器堆栈中的每个单独的视图控制器。

Apple 的一般设计准则是不应在任何地方使用大标题(例如,时钟应用程序不使用它们),并且通常首选只有第一级导航控制器使用大标题。但是,这些只是一般准则。

What's New in Cocoa Touch video (7:37) 中引入了大标题。

【讨论】:

【参考方案3】:

只需在 Storyboard / Interface Builder 的导航栏属性检查器中选中“首选大标题”即可:

【讨论】:

【参考方案4】:
if #available(iOS 11.0, *) 
    navigationController?.navigationBar.prefersLargeTitles = true
    navigationController?.navigationBar.topItem?.title = "Hello"
    navigationController?.navigationItem.largeTitleDisplayMode = .automatic

    let attributes = [
        NSAttributedStringKey.foregroundColor : UIColor.red,
        ]

    navigationController?.navigationBar.largeTitleTextAttributes = attributes
 else 
    // Fallback on earlier versions

【讨论】:

【参考方案5】:
if #available(iOS 11.0, *) 
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.navigationItem.largeTitleDisplayMode = .always
 else 
    // Fallback on earlier versions

请注意,beta 1 中有一些错误会导致大标题仅在您手动向上滚动时才会出现。

【讨论】:

Jordi,我的根 UIViewController 中有一个 UICollectionView。当我滚动时,而不是推另一个 VC 而不是回到根目录,导航栏会折叠成小的(即使我正在添加您的代码)。和你描述的一样吗? 嗨@RoiMulia,这听起来像是一个不同的错误。回到之前的VC,内容是否还在滚动?如果是这样,这是预期的行为,因为我相信只有在一直滚动到顶部时才会显示大导航栏。 是的,内容还在滚动。更奇怪的是,在我转到根 VC 并且标题崩溃后,如果我再次滚动(无论向哪个方向),标题就会变回大的存在(非平滑动画)。看起来像一个错误?【参考方案6】:

由于从 iOS 11 开始提供大标题,您还必须检查 iOS 版本:

if #available(iOS 11.0, *) 
    navigationController?.navigationBar.prefersLargeTitles = true

【讨论】:

以上是关于在 iOS 11 中使用增加的导航栏标题的主要内容,如果未能解决你的问题,请参考以下文章

iOS11导航栏问题

iOS11中缺少导航栏标题视图

带有 SearchBar 的 iOS 11 导航栏大小

iOS 11 在导航栏中自定义搜索栏

iOS 11、状态栏、导航栏和 UIScrollview

UIDocumentPicker 导航栏按钮在 iOS 11 中隐藏