Как изменить шрифт .navigationBarTitle в SwiftUI?

Я использую SwiftUI с Xcode 11 и хочу изменить шрифт NavigationBarTitle с помощью следующих строк кода:

.navigationBarTitle (Text("Navigation Bar Title"), displayMode: .inline)
    .font(.subheadline)

но ничего не произошло. любое предложение или комментарий?


person Sajjad    schedule 22.06.2019    source источник
comment
stackoverflow.com/questions/56505528/ похоже, но еще не ответил   -  person Prashant Tukadiya    schedule 22.06.2019
comment
Один из способов - использовать API внешнего вида. или дождитесь новой версии swiftui   -  person Prashant Tukadiya    schedule 22.06.2019


Ответы (4)


В 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("TEST")
            .navigationBarTitle (Text("TEST"), displayMode: .inline)
        }
    }
}

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

person Anjali Kevadiya    schedule 23.08.2019

Вы не можете изменить шрифт navigationBarTitle с помощью модификатора .font пока (протестировано в Xcode 11-Beta2).

Но вы можете создать свой собственный navigationBarView с полным доступом к любому из его подпредставлений следующим образом:

struct NavigationBarView: View {

    var body: some View {

        VStack(spacing: 0) {
            Rectangle()
                .foregroundColor(Style.Color.navigationBarColor)
                .edgesIgnoringSafeArea(.top)
                .frame(height: 0)

            Rectangle()
                .foregroundColor(Style.Color.navigationBarColor)
                .frame(height: 64)
            .overlay(
                HStack() {
                    Image("close")
                    Spacer()

                    Text("سفر به سلامت")
                        .font(Style.Font.navigationTitle)
                        .color(Style.Color.darkTextColor)
                        .multilineTextAlignment(.center)

                    Spacer()
                    Image("menu")
                }
            )

            Spacer()
        }
        .edgesIgnoringSafeArea(.horizontal)
    }
}

Обратите внимание, что с этой реализацией вы потеряете LargeTitleStyle.

person Mojtaba Hosseini    schedule 22.06.2019

Я думаю, вам нужно создать NavigationBarBuilder.

struct NavigationBarBuilder: UIViewControllerRepresentable {

    var build: (UINavigationController) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationBarBuilder>) -> UIViewController {

        UIViewController()
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationBarBuilder>) {

        if let navigationController = uiViewController.navigationController{
            self.build(navigationController)
        }
    }
}

и вы можете использовать его в своем просмотре содержимого.

struct ContentView: View {
    var body: some View {
        NavigationView {
            Text("")
                .navigationBarTitle("Türkiye", displayMode: .inline)
                .background(NavigationBarBuilder {navigationController in
                    navigationController.navigationBar.barTintColor = .red
                    navigationController.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
                })
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

Удачи...

person Erkam KUCET    schedule 21.10.2019

В SwiftUI 5 UINavigationBar.appearance (). TitleTextAttributes не работает. Для изменения шрифта в заголовке необходимо использовать одно из следующих средств:

        init () {
            UINavigationBar.appearance().largeTitleTextAttributes = [.font : UIFont(name: "Georgia", size: 20)!]
            // OR
            UINavigationBar.appearance().largeTitleTextAttributes = [.font:UIFont.preferredFont(forTextStyle:.text-style)]
        }

где .text-style можно найти в документации UIFont.TextStyle, например

.caption
.body
.title1
.title2
.title3
etc

Обновление 1 (чтобы ответить на вопросы о точном коде в комментариях)

struct ContentView: View {

    init () {
        let paragraph = NSMutableParagraphStyle()
        paragraph.alignment = .center
        
        UINavigationBar.appearance().largeTitleTextAttributes = [.font:UIFont.preferredFont(forTextStyle:.title2),
                                                                 .foregroundColor:UIColor.systemBlue,
                                                                 .paragraphStyle: paragraph
                                                                ]

...

то в теле у меня вот это. Вероятно, вам стоит обратить внимание на параметр displayMode

// Body is in the same ContentView struct. Settings from init will be used in navigationBarTitle
// listView() is just a custom function returning a SwiftUI's List()

var body: some View {


        NavigationView {
            
        listView()
            .navigationBarTitle(
                Text(self.accts.selCount <= 0 ? "Accounts" : "\(self.accts.selCount) selected")
                ,
                displayMode:.large)
person Oleg Gryb    schedule 05.10.2020
comment
Я не вижу эту работу. Пробовал в инициализации родительского NavigationView и в дочерних представлениях. Не могли бы вы привести краткий пример того, где именно находится этот init? - person Ryan; 29.05.2021
comment
@Ryan - см. Обновление 1 - person Oleg Gryb; 30.05.2021
comment
спасибо, но я не уверен, что понимаю. Последний блок имеет тело ViewBuilder с тремя AnyView и TabView с внутренним представлением навигации. Неясно, где будет размещен init ... в представлении, созданном func listView или чем-то еще. Можете ли вы написать как единую строящуюся структуру View? Я вижу, что глобальный метод переопределения работает: stackoverflow.com/a/67172529/14433738 - person Ryan; 30.05.2021
comment
@ Райан Это очень стандартно. 'init' является конструктором некоторой структуры ContentView: View .... ContentView используется в функции SceneDelegate.scene для настройки начального представления. 'var body' определяет пользовательский интерфейс содержимого в той же структуре ContentView. Не уверен, что сбивает с толку. И init, и var body определены в одном классе ContentView. В теле нужно обратить внимание только на одно: navigationBarTitle - person Oleg Gryb; 30.05.2021
comment
Немного обновлен ответ, чтобы прояснить, что и init, и var body находятся в одной структуре ContentView, которая является корнем всех представлений. - person Oleg Gryb; 30.05.2021
comment
Комментарий помогает прояснить намерение. Просто к вашему сведению от читателя, который создал несколько материальных приложений с помощью SwiftUI, форматирование / синтаксис кода имеет всевозможные странности с разделенной троичной системой, а скобки и скобки, возможно, перепутаны или не скопированы, что заставляет предположить, что происходит. Может он ТАК что-то делает с пастой. Тем не менее, спасибо за предложенный путь решения и за то, что нашли время отредактировать его. - person Ryan; 30.05.2021
comment
Да, форматирование было неважным. Я упростил вторую часть, убрав ненужные детали. Надеюсь, теперь читаемость лучше - person Oleg Gryb; 30.05.2021