设置largeSubtitleTextAttributes并没有生效
我在尝试在iOS 26上自定义导航栏的标题和副标题。但把 largeSubtitleTextAttributes 设置在 UINavigationBarAppearance 上似乎并没有起作用。
为了一个类似这样的视图:
NavigationStack {
// content
.navigationTitle("Title")
.navigationSubtitle("Subtitle")
}
我正在设置外观:
let appearance = UINavigationBarAppearance()
// Large title
appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.green]
appearance.largeSubtitleTextAttributes = [.foregroundColor: UIColor.yellow]
// Inline title
appearance.titleTextAttributes = [.foregroundColor: UIColor.blue]
appearance.subtitleTextAttributes = [.foregroundColor: UIColor.red]
let navAppearance = UINavigationBar.appearance()
navAppearance.standardAppearance = appearance
| 大 | 内联 |
|---|---|
| 大 | 内联 |
在这里我们可以看到,当滚动时,标题会缩小为内联样式,颜色从绿色变为蓝色。但副标题始终保持红色。如果我移除 subtitleTextAttributes,则两种情况下副标题都保持默认颜色。
这是 UINavigationBarAppearance 的一个问题吗?还是我做错了?我在一个 NavigationStack 的SwiftUI视图和一个 UINavigationController 的UIKit视图上都试过,行为都是一样的。
我已经能够在UIKit中通过使用 navigationItem.attributedSubtitle 和 navigationItem.largeAttributedSubtitle 让它正常工作,并且能够在两者之间进行切换。但显然在SwiftUI中做不到同样的效果。
解决方案
对于iOS 26,您可以考虑改用工具栏项。这比常规导航标题能应用更多的样式。
- 通过应用修饰符
.toolbarTitleDisplayMode(.automatic),并将工具栏项的放置位置设置为.largeTitle和.largeSubtitle,在内容向上滚动并进入安全区域时会自动消失。 - 同样,放置位置为
.subtitle的工具栏项在内容向上滚动时会自动出现。 - 同样也需要应用
.toolbarVisibility(.visible, for: .automatic),否则工具栏项可能完全不显示。 - 放置位置
.largeTitle、.largeSubtitle和.subtitle全部是iOS 26新增的。 - 你可能期望(或希望)放置位置为
.title的工具栏项能够像.subtitle那样在内容向上滚动时自动出现。不幸的是,事实并非如此。实际上,当包含放置位置为.title的项时,会干扰.subtitle的自动显示。原因可能是因为.title放置自iOS 14起就存在,苹果也许在尝试提供某种向后兼容性。 - 作为
.title无法适应新模式的一种变通做法,放置位置为.subtitle的项可以包含一个VStack,从而同时显示标题和副标题。 - 默认情况下,放置位置为
.largeTitle和.largeSubtitle的项会居中显示。如果你希望它们左对齐,可以应用.frame修饰符。 - 如果仍然需要,可以应用
.navigationTitle和.navigationSubtitle修饰符,但显示时工具栏项.largeTitle和.largeSubtitle将优先显示。事实上,这一点在这些项的文档页面上有说明(参见largeTitle与largeSubtitle)。
下面是一个简短示例,演示这一切如何正常工作:
struct ContentView: View {
let loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
var body: some View {
NavigationStack {
ScrollView {
VStack(spacing: 40) {
ForEach(0..<10) { _ in
Text(loremIpsum)
}
}
.padding()
}
// .navigationTitle("Title")
// .navigationSubtitle("Subtitle")
.toolbarTitleDisplayMode(.automatic)
.toolbarVisibility(.visible, for: .automatic)
.toolbar {
ToolbarItem(placement: .largeTitle) {
Text("Large Title")
.font(.largeTitle)
.fontWeight(.semibold)
.foregroundStyle(.green)
.frame(maxWidth: .infinity, alignment: .leading)
}
ToolbarItem(placement: .largeSubtitle) {
Text("Large Subtitle")
.font(.subheadline)
.foregroundStyle(.orange)
.frame(maxWidth: .infinity, alignment: .leading)
}
ToolbarItem(placement: .subtitle) {
VStack {
Text("Title")
.font(.title3)
.fontWeight(.semibold)
.foregroundStyle(.blue)
Text("Subtitle")
.font(.footnote)
.foregroundStyle(.red)
}
}
}
}
}
}

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。