如何为UINavigationBar的后退按钮创建投影?

时间:2018-05-02 19:43:33

标签: ios swift uinavigationbar back-button dropshadow

我创建了一个半透明的导航栏,并将其色调设置为白色。但是,有一个特定的VC包含地图,地图上的白色后退按钮有时不太明显。

因此,我创建了一个带阴影的后退按钮图像,并使用navigationController?.navigationBar.backIndicatorImage将其设置在该VC的viewWillAppear中,并在VC不在堆栈顶部时通过<设置回正常图像/ p>

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

。这很好。

然而,当我测试从地图VC到前一个VC的中途延伸但是然后释放跨度以便地图VC不被解雇但仍然触发viewWillAppear之前的VC,此时backIndicatorImage设置为正常图像,这是我不期望的。

我怎样才能达到目标?或者有没有办法在UINavigationBar的后台按钮上为UINavigationController中的特定VC设置投影?

1 个答案:

答案 0 :(得分:0)

UINavigationControllerDelegate有一个名为navigationController(_:willShow:animated:)的方法,您可以使用该方法在导航控制器推/动画动画旁边进行动画处理。

简而言之,您应该将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)有一些问题执行后退动画时(可能是个错误)。