我正在尝试在选项卡栏中实现交互式动画过渡。我使用了一个平移手势识别器。我制作了一种自定义动画,并使用UIPercentDrivenInteractiveTransition使切换变得交互性。但似乎我并不真正理解所有动画背后的过程。
我成功地实现了非交互式动画,但添加交互性似乎有些困难。我在互联网上阅读了许多教程,充分理解了每个人发布的代码片段是如何工作的,但我似乎无法在我的情况下实现它。我用两个带有导航栏的选项卡制作了一个选项卡应用程序。
以下是我的代码:
我成功地实现了非交互式动画,但添加交互性似乎有些困难。我在互联网上阅读了许多教程,充分理解了每个人发布的代码片段是如何工作的,但我似乎无法在我的情况下实现它。我用两个带有导航栏的选项卡制作了一个选项卡应用程序。
以下是我的代码:
TabBarController.swift
import UIKit
class TabBarController: UITabBarController, UITabBarControllerDelegate {
var usingGesture = false
var interactiveTransition:UIPercentDrivenInteractiveTransition?
override func viewDidLoad() {
super.viewDidLoad()
let panGesture = UIPanGestureRecognizer(target: self, action: "didPan:")
self.view.addGestureRecognizer(panGesture)
self.delegate = self
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tabBarController(tabBarController: UITabBarController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return self.interactiveTransition
}
func didPan(gesture: UIPanGestureRecognizer){
let point = gesture.locationInView(gesture.view)
let percent = fmax(fmin((point.x / 300.0), 0.99), 0.0)
self.interactiveTransition = UIPercentDrivenInteractiveTransition()
switch (gesture.state){
case .Began:
self.usingGesture = true
self.selectedIndex++
case .Changed:
self.interactiveTransition?.updateInteractiveTransition(percent)
case .Ended, .Cancelled:
if percent > 0.5 {
self.interactiveTransition?.finishInteractiveTransition()
} else {
self.interactiveTransition?.cancelInteractiveTransition()
}
self.usingGesture = false
default:
NSLog("Unhandled state")
}
}
}
TransitionToLeft.swift
import UIKit
class TransitionToLeft: UIPercentDrivenInteractiveTransition, UIViewControllerAnimatedTransitioning {
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let fromView:UIView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
let toView:UIView = transitionContext.viewForKey(UITransitionContextToViewKey)!
transitionContext.containerView().addSubview(fromView)
transitionContext.containerView().addSubview(toView)
toView.frame = CGRectMake(toView.frame.width, 0, toView.frame.width, toView.frame.height)
let fromNewFrame = CGRectMake(-1 * fromView.frame.width, 0, fromView.frame.width, fromView.frame.height)
UIView.animateWithDuration( 0.7, animations:{ () -> Void in
toView.frame = fromView.frame
fromView.frame = fromNewFrame
},{ (Bool) -> Void in
// update internal view - must always be called
transitionContext.completeTransition(true)
})
}
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
return 0.7
}
}
有人可以帮我解决这个问题吗?