Ios 如何进行可弹出或推送的交互式UINavigationController转换?推送动画正在翻转?
我想有一个奇怪的Ios 如何进行可弹出或推送的交互式UINavigationController转换?推送动画正在翻转?,ios,cocoa-touch,uiviewcontroller,uinavigationcontroller,Ios,Cocoa Touch,Uiviewcontroller,Uinavigationcontroller,我想有一个奇怪的UINavigationController概念,你可以通过向后平移将视图控制器从堆栈中弹出(就像iOS 7弹出手势),但它会记住弹出的视图控制器,允许你通过向另一个方向平移来“取消映射”(将其推回到堆栈上)。想象一下Safari中的前进和后退按钮,如果你后退,你仍然可以前进,如果你想把页面带回来 我已将UINavigationController子类化,并将自己设置为代理,返回一个UIViewControllerAnimatedTransitioning对象和一个uiperce
UINavigationController
概念,你可以通过向后平移将视图控制器从堆栈中弹出(就像iOS 7弹出手势),但它会记住弹出的视图控制器,允许你通过向另一个方向平移来“取消映射”(将其推回到堆栈上)。想象一下Safari中的前进和后退按钮,如果你后退,你仍然可以前进,如果你想把页面带回来
我已将UINavigationController
子类化,并将自己设置为代理,返回一个UIViewControllerAnimatedTransitioning
对象和一个uipercentdriventeractivetransition
对象:
func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if operation == .Push {
return Animator(presenting: true)
} else if operation == .Pop {
return Animator(presenting: false)
} else {
return nil
}
}
及
根据动画师是否设置为显示,我调用特定的方法,这适用于显示是否为真:
func presentWithTransitionContext(transitionContext: UIViewControllerContextTransitioning) {
let toViewControllerView = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!.view
let containerView = transitionContext.containerView()
containerView.addSubview(toViewControllerView)
toViewControllerView.transform = CGAffineTransformMakeTranslation(containerView.bounds.width, 0.0)
applyShadowToView(toViewControllerView)
let animationCurve: UIViewAnimationOptions = transitionContext.isInteractive() ? .CurveLinear : .CurveEaseInOut
UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, options: animationCurve, animations: {
toViewControllerView.transform = CGAffineTransformIdentity
}, completion: { finished in
return transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
})
}
我覆盖popViewControllerAnimated
,以便保存正在弹出的视图控制器:
override func popViewControllerAnimated(animated: Bool) -> UIViewController? {
poppedViewControllers.insert(visibleViewController!, atIndex: 0)
return super.popViewControllerAnimated(animated)
}
我在UINavigationController
子类“awakeFromNib()
中添加了一个uipangestureerecognizer
,它调用此方法来推送/弹出:
func panned(panGestureRecognizer: UIPanGestureRecognizer) {
let panningRight = panGestureRecognizer.translationInView(view).x > 0
let progress: CGFloat
if panningRight {
progress = panGestureRecognizer.translationInView(view).x / view.bounds.width
} else {
progress = -panGestureRecognizer.translationInView(view).x / view.bounds.width
}
if panGestureRecognizer.state == .Began {
interactiveTransition = UIPercentDrivenInteractiveTransition()
if panningRight {
popViewControllerAnimated(true)
} else {
let viewControllerToPush = poppedViewControllers[0]
poppedViewControllers.removeAtIndex(0)
pushViewController(viewControllerToPush, animated: true)
}
} else if panGestureRecognizer.state == .Changed {
interactiveTransition!.updateInteractiveTransition(progress)
} else if panGestureRecognizer.state == .Ended {
if progress > 0.5 {
interactiveTransition!.finishInteractiveTransition()
} else {
interactiveTransition!.cancelInteractiveTransition()
}
interactiveTransition = nil
} else if panGestureRecognizer.state == .Cancelled {
interactiveTransition!.cancelInteractiveTransition()
interactiveTransition = nil
}
}
但是,每当我用手势将以前弹出的视图控制器推到导航堆栈上时,它会以相反的方式设置演示文稿的动画(正在演示的视图控制器立即显示,当前视图控制器滑开)。我不知道为什么会这样。不可能两个都做吗?我是否在应该删除视图时不删除视图
func panned(panGestureRecognizer: UIPanGestureRecognizer) {
let panningRight = panGestureRecognizer.translationInView(view).x > 0
let progress: CGFloat
if panningRight {
progress = panGestureRecognizer.translationInView(view).x / view.bounds.width
} else {
progress = -panGestureRecognizer.translationInView(view).x / view.bounds.width
}
if panGestureRecognizer.state == .Began {
interactiveTransition = UIPercentDrivenInteractiveTransition()
if panningRight {
popViewControllerAnimated(true)
} else {
let viewControllerToPush = poppedViewControllers[0]
poppedViewControllers.removeAtIndex(0)
pushViewController(viewControllerToPush, animated: true)
}
} else if panGestureRecognizer.state == .Changed {
interactiveTransition!.updateInteractiveTransition(progress)
} else if panGestureRecognizer.state == .Ended {
if progress > 0.5 {
interactiveTransition!.finishInteractiveTransition()
} else {
interactiveTransition!.cancelInteractiveTransition()
}
interactiveTransition = nil
} else if panGestureRecognizer.state == .Cancelled {
interactiveTransition!.cancelInteractiveTransition()
interactiveTransition = nil
}
}