Удалить текст кнопки возврата с панели навигации в SwiftUI - PullRequest
1 голос
/ 04 марта 2020

Я недавно начал работать в SwiftUI и пришел к выводу, что работа с навигацией пока не очень хороша. Я пытаюсь добиться следующего. Мне, наконец, удалось избавиться от полупрозрачного фона без создания приложения cra sh, но теперь я столкнулся с следующей проблемой. Как я могу избавиться от «заднего» текста внутри navbaritem?

enter image description here

Я достиг представлений выше, установив внешний вид по умолчанию в SceneDelegate.swift файл наподобие этого.

let newNavAppearance = UINavigationBarAppearance()
newNavAppearance.configureWithTransparentBackground()
newNavAppearance.setBackIndicatorImage(UIImage(named: "backButton"), transitionMaskImage: UIImage(named: "backButton"))
newNavAppearance.titleTextAttributes = [
    .font: UIFont(name: GTWalsheim.bold.name, size: 18)!,
    .backgroundColor: UIColor.white

]

UINavigationBar.appearance().standardAppearance = newNavAppearance

Один из возможных способов добиться этого - переопределить элементы панели навигации, однако у этого есть один недостаток ( Текст пользовательской кнопки возврата SwiftUI для NavigationView ) Как уже сказал создатель этой проблемы, обратный жест перестает работать после переопределения элементов панели навигации. При этом мне также интересно, как я мог установить цвет переднего плана кнопки «Назад». Теперь он имеет синий цвет по умолчанию, но я бы хотел перезаписать его другим цветом.

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Стандартный Назад название кнопки берется из заголовка навигационной панели предыдущего экрана.

Для получения необходимого эффекта возможен следующий подход:

demo

struct TestBackButtonTitle: View {
    @State private var hasTitle = true
    var body: some View {
        NavigationView {
            NavigationLink("Go", destination:
                Text("Details")
                    .onAppear {
                        self.hasTitle = false
                    }
                    .onDisappear {
                        self.hasTitle = true
                    }
            )
            .navigationBarTitle(self.hasTitle ? "Master" : "")
        }
    }
}
0 голосов
/ 05 марта 2020

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

.navigationBarItems(leading:
    Image("backButton")
        .foregroundColor(.blue)
        .onTapGesture {
            self.presentationMode.wrappedValue.dismiss()
    }
)

Единственная проблема с этим состояла в том, что жест спины не работал, и это было решено путем фактического расширения UINavigationController

extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}

Теперь все выглядит именно так, как я хочу, решение вроде хакерское ... но пока оно работает, надеюсь SwiftUI немного повзрослеет, так что это можно сделать проще.

0 голосов
/ 04 марта 2020

На контроллере вида назначения попробуйте что-то вроде:

override func viewDidLoad() {

        super.viewDidLoad()

        self.navigationItem.setHidesBackButton(true, animated: false)

    }
...