在 iOS 11 中使用增加的 navigation-bar 标题

Use the increased navigation-bar title in iOS 11

iOS 11 Beta 1 对几乎所有 system-apps 使用增加的 navigation-bar 标题(它在 iOS 10 和音乐应用程序中开始这样做)。我想知道 Apple 在 iOS 11 中是否有 public API,或者它是否会暂时保持私有状态。

行为是标题增加了 font-size,左对齐,一旦用户向下滚动,标题就会移动到 navigation-bar。我在此处的“消息”应用程序中附加了一些显示此行为的屏幕:

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

UINavigationBar API 对于 iOS 11 所做的唯一更改是 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
]

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) 中引入。

if #available(iOS 11.0, *) {
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.navigationItem.largeTitleDisplayMode = .always
} else {
    // Fallback on earlier versions
}

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

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
}

只需在 Storyboard/Interface Builder 的导航栏属性检查器中检查 "Prefers Large Titles":

由于自 iOS 11 起就可以使用大标题,因此您还必须检查 iOS 版本:

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