如何在弹出期间为UINavigationBar backgroundImage设置动画

cha*_*oad 5 uinavigationbar uinavigationcontroller ios swift3

我正在尝试在弹出过渡期间为导航栏的backgroundImage设置动画。

我意识到backgroundImage不是一个可设置动画的属性,但是我已经能够在推送过程中通过在以下之间进行转换的视图控制器的viewWillAppear方法中使用CATransition实现此目的:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let animation = CATransition()
    animation.duration = 0.3
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    animation.type = kCATransitionFade

    navigationController?.navigationBar.layer.add(animation, forKey: nil)
    navigationController?.navigationBar.setBackgroundImage(navigationBarBackgroundImage, for: .default)
}
Run Code Online (Sandbox Code Playgroud)

我希望它在弹出期间也能正常工作,但是发生的是导航栏突然在弹出动画完成后突然显示下一个视图控制器的背景图像(未动画)。

我还尝试将上述尝试与过渡协调器组合在一起,但是在弹出完成后图像突然改变的情况下,它会产生完全相同的结果。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    transitionCoordinator?.animate(alongsideTransition: { [weak self] (context) in
    let animation = CATransition()
    animation.duration = 0.3
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    animation.type = kCATransitionFade

    self?.navigationController?.navigationBar.layer.add(animation, forKey: nil)
    self?.navigationController?.navigationBar.setBackgroundImage(navigationBarImage, for: .default)
    }, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我正在寻找一种可在iOS9和iOS10上运行的方法。