我创建了一个半透明的导航栏,并将其色调设置为白色。但是,有一个特定的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设置投影?
答案 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)
有一些问题执行后退动画时(可能是个错误)。