2014-12-29 4 views
1

Я следовал за This учебным пособием и добился этой анимации, но теперь я хочу добавить в нее некоторые функции, например, когда пользователь нажимает на свернутый viewController. Я хочу всплывать, что сворачивает viewController назад. Я попытался выполнить TapGesture на этой точке зрения, и это мой код:Проблема со сдвижным меню Навигация в Swift

import Foundation 
import UIKit 

class TransitionOperator: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate{ 

var snapshot : UIView! 
var isPresenting : Bool = true 

func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { 
    return 0.5 
} 


func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 
    if isPresenting{ 
     presentNavigation(transitionContext) 
    }else{ 
     dismissNavigation(transitionContext) 
    } 
} 

func presentNavigation(transitionContext: UIViewControllerContextTransitioning) { 
    let container = transitionContext.containerView() 
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 
    let fromView = fromViewController!.view 
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 
    let toView = toViewController!.view 

    let size = toView.frame.size 
    var offSetTransform = CGAffineTransformMakeTranslation(size.width - 120, 0) 
    offSetTransform = CGAffineTransformScale(offSetTransform, 0.6, 0.6) 

    snapshot = fromView.snapshotViewAfterScreenUpdates(true) 

    //TapGesture for detect touch 
    let aSelector : Selector = "singleTap" 
    let tapGesture = UITapGestureRecognizer(target: self, action: aSelector) 
    tapGesture.numberOfTapsRequired = 1 
    self.snapshot.addGestureRecognizer(tapGesture) 

    container.addSubview(toView) 
    container.addSubview(snapshot) 

    let duration = self.transitionDuration(transitionContext) 

    UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.8, options: nil, animations: { 

     self.snapshot.transform = offSetTransform 

     }, completion: { finished in 

      transitionContext.completeTransition(true) 
    }) 

} 
func singleTap(){ 

    NavigationViewController().dismissViewControllerAnimated(true, completion: nil) 
    println("Touched") 

} 

func dismissNavigation(transitionContext: UIViewControllerContextTransitioning) { 

    let container = transitionContext.containerView() 
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 
    let fromView = fromViewController!.view 
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 
    let toView = toViewController!.view 

    let duration = self.transitionDuration(transitionContext) 

    UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.8, options: nil, animations: { 

     self.snapshot.transform = CGAffineTransformIdentity 

     }, completion: { finished in 
      transitionContext.completeTransition(true) 
      self.snapshot.removeFromSuperview() 
    }) 
} 

func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

    self.isPresenting = true 
    return self 
} 

func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

    self.isPresenting = false 
    return self 
    } 
} 

, когда я нажимаю на этой свернутом зрения Touched является печать, как вы можете видеть на изображении:

enter image description here

Но вид не уволен. Я хочу всплывающее окно TimelineViewController назад.

Заранее спасибо.

+0

Использование ** https: //github.com/mutualmobile/MMDrawerController** классы для создания слайд-представления –

+0

yes.i управлять им –

+0

Вы поняли решение этого? У меня такая же проблема. Я также пытаюсь добавить такие функциональные возможности, что пользователь может использовать жест слайдов вместо того, чтобы щелкнуть значок панели меню в левом верхнем углу. – Mike

ответ

0

Возможно, что вам нужно сделать, это вызвать self.dismissNavigation() из вашего метода singleTap. Хотя я не уверен, какой контекст подходит к этому методу ...

+0

Спасибо за ответ, но что я должен передать в self.dismissNavigation()? –

0

Я знаю, что прошло несколько месяцев, но я понял это. Посмотрите на функцию animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController), которая имеет параметр presented, UIViewController моментального снимка. Это ваша ссылка, которая вам нужна вместо вызова NavigationViewController()., который просто создает новые экземпляры. Поэтому создайте переменную UIViewvar foo : UIView! и в animationControllerForPresentedController() комплект foo = presented.

Теперь в вашей функции singleTap() вы можете установить foo.dismissViewControllerAnimated().

Надеюсь, это поможет.

Смежные вопросы