Как создать тень для кнопки назад UINavigationBar? - PullRequest
0 голосов
/ 02 мая 2018

Я создал полупрозрачную панель навигации и установил для нее оттенок белого. Тем не менее, есть определенный VC, содержащий карту, и белая кнопка «назад» на карте иногда не видна.

Поэтому я создал изображение кнопки «Назад» с тенью и с помощью navigationController?.navigationBar.backIndicatorImage установил его в viewWillAppear этого VC и вернул нормальное изображение, когда VC не находится на вершине стека, через

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.viewWillAppear(animated)
}

предыдущего ВК. Это отлично работает.

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

Как я мог достичь цели? Или есть какой-либо способ установить тень на кнопке «назад» в UINavigationBar только для определенного VC в UINavigationController?

1 Ответ

0 голосов
/ 03 мая 2018

UINavigationControllerDelegate имеет метод под названием navigationController(_:willShow:animated:), который можно использовать для анимации наряду с анимацией push / pop контроллера навигации.

Короче говоря, вы должны создать подкласс UINavigationController и сделать его делегатом самого себя:

import UIKit

class AppNavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension AppNavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        guard animated, let vc = viewController as? ShadowBackButtonProtocol, vc.shouldAddShadowToImage, let image = vc.myImage else {
            return
        }

        navigationController.transitionCoordinator?.animate(alongsideTransition: { (context) in
            if vc.shouldAddShadowToImage {
                // Add your shadow
            } else {
                // Remove the shadow
            }
        }, completion: nil)
    }
}

Конечно, оба контроллера представления должны реализовать ShadowBackButtonImage:

protocol ShadowBackImageButton {
    var shouldAddShadowToImage: Bool { get }
    var myImage: UIImage? { get }
}

extension MyViewController: ShadowBackImageButton {
    var shouldAddShadowToImage: Bool { return true }
    var myImage: UIImage? { return navigationController?.navigationBar.backIndicatorImage }
}

extension AnotherSubclassOfViewController: ShadowBackImageButton {
    var shouldAddShadowToImage: Bool { return false }
    var myImage: UIImage? { return navigationController?.navigationBar.backIndicatorImage }
}

Если вы спросите меня, я бы предпочел добавить UIView поверх контроллера вида, который должен добавить тень и просто имитировать внешний вид UINavigationBar, так как navigationController(_:willShow:animated) имел некоторые проблемы при выполнении назад анимация (это, вероятно, ошибка).

...