我知道在使用 prefersLargeTitles 时,您可以分别为“大”和“小”标题设置字体、颜色、字体大小。
但是,在导航控制器上启用“LargeTitles”是否有可能使“扩展”导航栏上的“大标题”以大写字符显示?
那些。达到这个效果:
现在我为此目的使用自定义导航控制器:
class MyNavigationController: UINavigationController {
public var titleSaved: String?
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
guard let topItem = navigationBar.topItem else {
return
}
if navigationBar.frame.size.height > 60 {
topItem.title = topItem.title?.uppercased()
} else {
if let titleSaved = titleSaved {
topItem.title = titleSaved
} else {
topItem.title = topItem.title?.applyingTransform(StringTransform(rawValue: "Title"), reverse: false)
}
}
}
}
从视图控制器设置标题:
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.prefersLargeTitles = true
let title = "Sign In"
navigationItem.title = title
if let nc = navigationController as? MyNavigationController {
nc.titleSaved = title
}
}
}
此解决方案有效,但是当从“大”标头更改为“小”标头并再次变回时,它会有点抽搐 - 它看起来不太漂亮......

不幸的是,属性字符串没有设置大小写的键。是的,大标题的设置相当少,确保从应用程序到应用程序看起来都是统一的。
如果您只需要更改标题的大小写,请使您的元素具有类似的行为但具有必要的功能。
如果您需要其他好处,则需要跟踪当前状态并相应更改标题。
使用 KVO 和 UILabel 作为 titleView 的选项,但我认为它适合您的任务。结果:
首先我们需要找到负责大标题的部分,然后观察变化。完整示例: