Как правильно настроить оттенок стрелки кнопки назад в ios 13?

11

В ios 13 Apple представила новый прокси-объект UINavigationBarAppearance для настройки внешнего вида панели навигации. Я был в состоянии установить почти все, что мне нужно, кроме одной маленькой вещи. Стрелка кнопки «Назад» всегда отображается с синим оттенком, и я не знаю, как установить желаемый цвет. Я использую старый [[UINavigationBar appearance] setTintColor:]способ, но я думаю, что должен быть какой-то способ сделать это с помощью API объектов UINavigationBarAppearance. У кого-нибудь есть идеи, как?

Роман
источник

Ответы:

1

Новый способ установки цвета кнопки «Назад» внешнего вида (прокси) будет выглядеть так:

let appearance = UINavigationBarAppearance()

// Apply the configuration option of your choice
appearance.configureWithTransparentBackground()

// Create button appearance, with the custom color
let buttonAppearance = UIBarButtonItemAppearance(style: .plain)
buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.white]

// Apply button appearance
appearance.buttonAppearance = buttonAppearance

// Apply tint to the back arrow "chevron"
UINavigationBar.appearance().tintColor = UIColor.whiteI

// Apply proxy
UINavigationBar.appearance().standardAppearance = appearance

// Perhaps you'd want to set these as well depending on your design:
UINavigationBar.appearance().compactAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance
Джастин Ганзер
источник
5

У меня есть настройки контроллера пользовательских навигации в моем приложении, которое изменяет navigationBarей titleTextAttributes, tintColorи другие в зависимости от различных сценариев.

При запуске приложения на iOS 13 у backBarButtonItemстрелки был синий оттенок по умолчанию. Отладчик представления показал, что только у UIBarButtonItems UIImageViewбыл этот синий оттенок.

В итоге я настроил navigationBar.tintColorдважды, чтобы он изменил цвет ...

public class MyNavigationController: UINavigationController, UINavigationControllerDelegate {

    public var preferredNavigationBarTintColor: UIColor?

    override public func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }


    public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {

        // if you want to change color, you have to set it twice
        viewController.navigationController?.navigationBar.tintColor = .none
        viewController.navigationController?.navigationBar.tintColor = preferredNavigationBarTintColor ?? .white

        // following line removes the text from back button
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

    }


Самым странным моментом при поиске решения был противоречивый результат, который заставляет меня думать, что это связано с просмотром анимации жизненного цикла и / или внешнего вида или кэша Xcode :)

Артур
источник
2
Не могу поверить, что все хак-исправления, которые нам нужно сделать для поддержки iOS 13: / Спасибо за исправление, кстати!
Sreejith
Странно, мне не нужно устанавливать его .noneили nil, я просто даю ему цвет после установки внешнего вида, и он просто работает
Марк