具有交互式动画过渡效果的TabBarController

5
我正在尝试在选项卡栏中实现交互式动画过渡。我使用了一个平移手势识别器。我制作了一种自定义动画,并使用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
}

}

有人可以帮我解决这个问题吗?

1个回答

1
我认为你的问题在于手势识别器。尝试将其添加到self.selectedViewController.view而不是self.view
此外,你的代码有误:self.interactiveTransition = UIPercentDrivenInteractiveTransition() 应该改为 self.interactiveTransition = TransitionToLeft()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接