2015-01-25 2 views
5

TabBar의 탭간에 대화식 애니메이션 전환을 구현하려고합니다. 팬 제스처 인식기를 사용하고 있습니다. 나는 커스텀 애니메이션을 만들었고 UIPercentDrivenInteractiveTransition을 사용하여 스위칭을 대화 형으로 만들었다. 그러나 나는 모든 애니메이션 뒤에 숨어있는 과정을 정말로 이해하지 못하는 것 같습니다.
비대화 형 애니메이션을 만들었지 만 상호 작용을 추가하는 것은 다소 어려웠습니다. 인터넷에서 많은 자습서를 읽었으며 모든 사람들이 게시하는 코드 스 니펫이 어떻게 작동 하는지를 완전히 이해하지만 필자의 경우에는 구현할 수 없습니다. 탐색 바를 사용하여 두 개의 탭이있는 TabBar 응용 프로그램을 만들었습니다.대화 형 애니메이션 전환을 사용하는 TabBarController

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

제스처 인식기에 문제가 있다고 생각합니다. self.view 대신 self.selectedViewController.view에 추가하십시오.

또한 코드가 잘못되었습니다. self.interactiveTransition = UIPercentDrivenInteractiveTransition()self.interactiveTransition = TransitionToLeft()이어야합니다.

관련 문제