UINavigationBar Заголовок кнопки "Назад" нельзя удалить с помощью внешнего вида панели навигации для iOS 13

В моем приложении я хочу удалить UINavigationBarЗаголовок кнопки "Назад". Я сделал следующие коды

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     // do other staffs 
     initNavigationBar()

     return true 

}

private func initNavigationBar() {

        let appearance = UINavigationBar.appearance()
        appearance.barTintColor = GLOBAL_TINT_COLOR // a globally declared colour 
        appearance.tintColor = .white
        appearance.barStyle = .black

        if #available(iOS 13.0, *) {
            let backButtonAppearance = UIBarButtonItemAppearance()
            backButtonAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.clear]
            appearance.standardAppearance.backButtonAppearance = backButtonAppearance
            appearance.compactAppearance?.backButtonAppearance = backButtonAppearance
            appearance.scrollEdgeAppearance?.backButtonAppearance = backButtonAppearance
        } else {


            // Hide navigation bar back button items

            UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

            UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)
        }

}

Однако этот код всегда работает для iOS 10-12, но не работает на iOS 13. Я что-то пропустил?

В других случаях я нашел много ответов по теме, но не нашел решения для iOS 13

Я никогда не хочу использовать set back button title as an empty string, а не исправлять это с помощью внешнего вида.

Спасибо

3 ответа

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

Я сделал что-то подобное, расширив UINavigationController:

@available(iOS 13, *)
func hideBackButton() {
    let appearance = self.navigationBar.standardAppearance

    let hideBackButtonTitleAttributes: [NSAttributedString.Key: Any] = [
        .foregroundColor: UIColor.clear
    ]

    let normalBackButton = appearance.backButtonAppearance.normal
    let highlightedBackButton = appearance.backButtonAppearance.highlighted

    normalBackButton.titleTextAttributes = hideBackButtonTitleAttributes
    highlightedBackButton.titleTextAttributes = hideBackButtonTitleAttributes

    navigationBar.standardAppearance = appearance
}

Затем я использовал hideBackButton метод так:

navigationController?.hideBackButton()

Если есть лучший способ сделать это для всего приложения, дайте мне знать.

Я добавил ios15, удалил заголовок кнопки BackBar и установил навигацию:

          if #available(iOS 15, *) {
        let appearance = UINavigationBarAppearance()
        let pargraphStyle = NSMutableParagraphStyle()
        pargraphStyle.alignment = .center
        let fontApply = UIFont.bold(size: 18)
        UINavigationBar.appearance().tintColor = UIColor.themeColor
        appearance.configureWithOpaqueBackground()
        appearance.backgroundColor = UIColor.black
        appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.themeColor, NSAttributedString.Key.font: fontApply, NSAttributedString.Key.paragraphStyle: pargraphStyle]
        appearance.shadowImage = nil
        appearance.shadowColor = .clear
        UINavigationBar.appearance().barStyle = .default
        UINavigationBar.appearance().tintColor = UIColor.themeColor
        UINavigationBar.appearance().isTranslucent = false
        UINavigationBar.appearance().backIndicatorImage = #imageLiteral(resourceName: "BackIcon")
        UINavigationBar.appearance().backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "BackIcon")
        UINavigationBar.appearance().standardAppearance = appearance
        UINavigationBar.appearance().scrollEdgeAppearance = appearance
        
        // Set Back Bar Button Appearance
        let appearanceBackButton = UIBarButtonItemAppearance()

        let hideBackButtonTitleAttributes: [NSAttributedString.Key: Any] = [
            .foregroundColor: UIColor.clear
        ]

        let normalBackButton = appearance.backButtonAppearance.normal
        let highlightedBackButton = appearance.backButtonAppearance.highlighted

        normalBackButton.titleTextAttributes = hideBackButtonTitleAttributes
        highlightedBackButton.titleTextAttributes = hideBackButtonTitleAttributes
        appearance.buttonAppearance = appearanceBackButton
    
    }

Вы можете настроить свой задний элемент так, чтобы он не имел заголовка, например:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:nil style:UIBarButtonItemStylePlain target:nil action:nil];

Обратите внимание, что это влияет на то, что появляется, когда что-то еще помещается в стек навигации. Если вы установите контроллер представления A в качестве корня контроллера навигации и установите такой элемент заднего вида A, вы увидите его, когда вы поместите контроллер представления B в стек. Настройка элемента "Назад" для B не повлияет на то, что вы видите в элементе "Назад", когда элемент B виден.

Другие вопросы по тегам