在 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 应用中附加了一些显示此行为的屏幕:
虽然到目前为止我在UINavigationController
和UINavigationBar
中找不到任何参考,但也许有人知道更多细节!
【问题讨论】:
在文档中: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 中使用增加的导航栏标题的主要内容,如果未能解决你的问题,请参考以下文章