Как изменить атрибуты текста для заголовка панели навигации в SwiftUI?

В последнее время я играю с новым фреймворком SwiftUI.

У меня есть базовое понимание того, как работает фреймворк, но я не могу найти способ изменить атрибуты заголовка для панели навигации.

Я использую последнюю версию Xcode 11 beta 5 и соответствующую версию swift/swiftUI

Я уже попробовал несколько вещей. Первым делом я попытался просто добавить модификаторы в текст, но каким-то образом SwiftUI, похоже, игнорирует модификаторы в среде панели навигации.

Во-вторых, я попытался изменить атрибуты заголовка через UINavigationBar.apperance().titleTextAttributes = ...

но похоже, что они удалили возможность настраивать titleTextAttributes UINavigationBar в последней бета-версии.

//First thing:
List(myData) {
  ...
}
.navigationBarTitle(Text("My title").font(myFont))


// Second thing
UINavigationBar.appearance().titleTextAttributes = myAttrs

Я ожидаю, что заголовок панели навигации будет иметь мой собственный шрифт, но это всегда шрифт Apple по умолчанию.

2 ответа

В SwiftUI на данный момент мы не можем изменить navigationBarTitle шрифт, но вы можете изменить внешний вид навигационной панели следующим образом:

struct YourView: View {
    init() {
        //Use this if NavigationBarTitle is with Large Font
        UINavigationBar.appearance().largeTitleTextAttributes = [.font : UIFont(name: "Georgia-Bold", size: 20)!]

        //Use this if NavigationBarTitle is with displayMode = .inline
        //UINavigationBar.appearance().titleTextAttributes = [.font : UIFont(name: "Georgia-Bold", size: 20)!]
    }

    var body: some View {
        NavigationView {
            Text("Hello World!")
              .navigationBarTitle(Text("Dashboard").font(.subheadline), displayMode: .large)
            //.navigationBarTitle (Text("Dashboard"), displayMode: .inline)
        }
    }
}

Я надеюсь, что это поможет вам. Спасибо!!

Я заставил это работать нормально.

Я храню его в структуре @main (iOS 14), которую я считаю чище, чем init() в представлении.

      extension UINavigationController {
    override open func viewDidLoad() {
        super.viewDidLoad()
        
        let appearance = UINavigationBarAppearance()
        
        appearance.configureWithOpaqueBackground()
        appearance.titleTextAttributes = [.foregroundColor: UIColor.white]
        appearance.largeTitleTextAttributes = [.foregroundColor: UIColor  .white]
        
        appearance.largeTitleTextAttributes = [.font : UIFont(name: "OfficinaSans", size: 30)!]
        appearance.titleTextAttributes = [ .font : UIFont(name: "OfficinaSans", size: 20)!]
        appearance.shadowColor = .white
        
        navigationBar.standardAppearance = appearance
        navigationBar.compactAppearance = appearance
        navigationBar.scrollEdgeAppearance = appearance
         
    }
    
}
Другие вопросы по тегам