更新到正确的版本,因为得到了答案。
我想在导航 View Controller 弹出/推送时做淡入/淡出动画,然后我实现一个 BaseViewController
:
class BaseViewController: UIViewController, UINavigationControllerDelegate {
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.delegate = self
}
func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if (operation == UINavigationControllerOperation.Push) {
return FadeInAnimator()
}
if (operation == UINavigationControllerOperation.Pop) {
return FadeOutAnimator()
}
return nil;
}
}
和FadeInAnimator
、FadeOutAnimator
:
class FadeInAnimator: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.5
}
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
transitionContext.containerView()?.addSubview(toViewController!.view)
toViewController?.view.alpha = 0.0
UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in
toViewController?.view.alpha = 1.0
}) { (finished) -> Void in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
}
}
}
class FadeOutAnimator: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.5
}
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
transitionContext.containerView()?.insertSubview((toViewController?.view)!, belowSubview: (fromViewController?.view)!)
UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in
fromViewController?.view.alpha = 0.0
}) { (finished) -> Void in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
}
}
然后,我添加了 2 个 View Controller 并嵌入了导航 View Controller ,ViewControllerA
和 ViewControllerB
:
class ViewControllerA: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func pressButton(sender: UIButton) {
if let vc = create(ViewControllerB) {
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
class ViewControllerB: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
在 ViewControllerA
上按下按钮将创建并跳转到 ViewControllerB
,然后在 ViewControllerB
上按下导航栏项“返回”将返回到 ViewControllerA
.
但它不起作用,当按下按钮时,ViewControllerA
显示 ViewControllerB
,然后再次显示 ViewControllerA
。
有什么建议吗?我的 xcode 是 7.1 并在 iPad Air 2 模拟器上运行。
最佳答案
在 FadeInAnimator 的动画完成 block 中
改变这个
transitionContext.completeTransition(transitionContext.transitionWasCancelled())
到
transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
关于ios - UINavigationControllerDelegate 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359774/