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

问题描述 投票:53回答:5

iOS 11 Beta 1几乎为所有系统应用程序使用增加的导航栏标题(它开始在iOS 10和音乐应用程序中执行此操作)。我想知道Apple是否有iOS 11的公共API,或者它现在是否会保密。

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

enter image description here

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

ios iphone uinavigationbar xcode9-beta ios11
5个回答
103
投票

对iOS 11的UINavigationBar API所做的唯一更改只是prefersLargetitles。检查here

您可以通过一个小的更改对自己的应用程序执行此操作:在IB中为您的导航栏选中“首选大标题”,或者如果您希望在代码中使用它

navigationController?.navigationBar.prefersLargeTitles = true

编辑

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

UINavigationBar.appearance().largeTitleTextAttributes = [
    NSForegroundColorAttributeName: UIColor.white
]

Swift 4.2的更新:

由于NSForegroundColorAttributeName已更名为NSAttributedString.Key.foregroundColor,请使用:

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

10
投票

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的一般设计指南是不应该在任何地方使用大型标题(例如,Clock应用程序不使用它们),并且通常优选的是只有导航控制器的第一级使用大标题。但是,这些只是一般指导原则。

What's New in Cocoa Touch video(7:37)引入了大型头衔。


6
投票

只需在导航栏属性检查器中选中“首选大标题”即可

enter image description here


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

请注意,测试版1中存在一些错误,导致只有在手动向上滚动时才会显示大标题。


5
投票
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
}
© www.soinside.com 2019 - 2024. All rights reserved.