SwiftUI обновляет цвет заголовка панели навигации
Как изменить цвет заголовка панели навигации в SwiftUI
NavigationView {
List{
ForEach(0..<15) { item in
HStack {
Text("Apple")
.font(.headline)
.fontWeight(.medium)
.color(.orange)
.lineLimit(1)
.multilineTextAlignment(.center)
.padding(.leading)
.frame(width: 125, height: nil)
Text("Apple Infinite Loop. Address: One Infinite Loop Cupertino, CA 95014 (408) 606-5775 ")
.font(.subheadline)
.fontWeight(.regular)
.multilineTextAlignment(.leading)
.lineLimit(nil)
}
}
}
.navigationBarTitle(Text("TEST")).navigationBarHidden(false).foregroundColor(.orange)
}
Я пытался с .foregroundColor(.orange)
но он не работает
также пробовал .navigationBarTitle(Text("TEST").color(.orange))
Любая помощь?
Ответы
Ответ 1
Я разработал небольшой пример пользовательской навигации SwiftUI, которая может обеспечить полную визуальную настройку и программную навигацию. Его можно использовать в качестве замены для NavigationView.
Вот класс NavigationStack, который работает с currentView и стеком навигации:
final class NavigationStack: ObservableObject {
@Published var viewStack: [NavigationItem] = []
@Published var currentView: NavigationItem
init(_ currentView: NavigationItem ){
self.currentView = currentView
}
func unwind(){
if viewStack.count == 0{
return
}
let last = viewStack.count - 1
currentView = viewStack[last]
viewStack.remove(at: last)
}
func advance(_ view:NavigationItem){
viewStack.append( currentView)
currentView = view
}
func home( ){
currentView = NavigationItem( view: AnyView(HomeView()))
viewStack.removeAll()
}
}
Вы можете посмотреть здесь: полный пример с объяснением:
PS: я не уверен, почему этот был удален. Я думаю, что это ответ на вопрос, поскольку это идеальная функциональная альтернатива NavigationView.
Ответ 2
В SwiftUI вы не можете напрямую изменить навигационный заголовок. Вы должны изменить внешний вид UINavigation в init()
следующим образом,
struct YourView: View {
init() {
//Use this if NavigationBarTitle is with Large Font
UINavigationBar.appearance().largeTitleTextAttributes = [.foregroundColor: UIColor.red]
//Use this if NavigationBarTitle is with displayMode = .inline
UINavigationBar.appearance().titleTextAttributes = [.foregroundColor: UIColor.red]
}
var body: some View {
NavigationView {
List{
ForEach(0..<15) { item in
HStack {
Text("Apple")
.font(.headline)
.fontWeight(.medium)
.color(.orange)
.lineLimit(1)
.multilineTextAlignment(.center)
.padding(.leading)
.frame(width: 125, height: nil)
Text("Apple Infinite Loop. Address: One Infinite Loop Cupertino, CA 95014 (408) 606-5775 ")
.font(.subheadline)
.fontWeight(.regular)
.multilineTextAlignment(.leading)
.lineLimit(nil)
}
}
}
.navigationBarTitle(Text("TEST")).navigationBarHidden(false)
//.navigationBarTitle (Text("TEST"), displayMode: .inline)
}
}
}
Я надеюсь, что это сработает. Спасибо!!
Ответ 3
Если у вас есть контент как
struct MyContent : View {
...
}
тогда вы можете поместить это в виде навигации с красным фоном:
NavigationView {
ZStack(alignment: .top) {
Rectangle()
.foregroundColor(Color.red)
.edgesIgnoringSafeArea(.top)
MyContent()
}
}
Я обновлю свой ответ, как только узнаю, как обновить сам текст заголовка.
Ответ 4
init() { // for navigation bar title color
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.red]
// For navigation bar background color
UINavigationBar.appearance().backgroundColor = .green
}
NavigationView {
List{
ForEach(0..<15) { item in
HStack {
Text("Apple")
.font(.headline)
.fontWeight(.medium)
.color(.orange)
.lineLimit(1)
.multilineTextAlignment(.center)
.padding(.leading)
.frame(width: 125, height: nil)
Text("Apple Infinite Loop. Address: One Infinite Loop Cupertino, CA 95014 (408) 606-5775 ")
.font(.subheadline)
.fontWeight(.regular)
.multilineTextAlignment(.leading)
.lineLimit(nil)
}
}
}
.navigationBarTitle(Text("TEST")).navigationBarHidden(false)
}
Ответ 5
UINavigationBar.appearance().largeTitleTextAttributes = [
NSAttributedString.Key.foregroundColor: UIColor.yellow
]
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.yellow
]
Ответ 6
Нет необходимости использовать .appearance()
, чтобы сделать это глобально.
Хотя SwiftUI не отображает стили навигации напрямую, вы можете обойти это, используя UIViewControllerRepresentable
. Поскольку SwiftUI использует обычный UINavigationController
за кулисами, контроллер представления все равно будет иметь действительное свойство .navigationController
.
struct NavigationConfigurator: UIViewControllerRepresentable {
var configure: (UINavigationController) -> Void = { _ in }
func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
UIViewController()
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
if let nc = uiViewController.navigationController {
self.configure(nc)
}
}
}
И использовать его
struct ContentView: View {
var body: some View {
NavigationView {
ScrollView {
Text("Don't use .appearance()!")
}
.navigationBarTitle("Try it!", displayMode: .inline)
.background(NavigationConfigurator(configure: { nc in
nc.navigationBar.barTintColor = .blue
}))
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
Ответ 7
let titleAttributes =
[ NSAttributedString.Key.foregroundColor: UIColor.orange ]
self.navigationController?.navigationBar.titleTextAttributes = titleAttributes