2016-06-18 9 views
0

皆私は、インタラクティブなビューコントローラーのトランジションの解決策を見つけようとしている私の髪を引き裂いています。ここでは、下方向のパンジェスチャーを使用して、下。誰かがこのようなコードを作成したり実行したりしていますか?以下は私のコードです。私はすでに解任ジェスチャーを持っていますが、画面上をスワイプしてView Controllerを表示する方法を理解できません。助けてください!!!パンジェスチャーを使用したインタラクティブなviewController

import UIKit  
class ViewController: UIViewController { 

let interactor = Interactor() 
    var interactors:Interactor? = nil 
    let Mview = ModalViewController() 
let mViewT: ModalViewController? = nil 
var presentedViewControllers: UIViewController? 

override func viewDidLoad() { 
    Mview.transitioningDelegate = self 
    Mview.modalPresentationStyle = .FullScreen 
} 

    @IBAction func cameraSlide(sender: UIPanGestureRecognizer) { 



    let percentThreshold:CGFloat = 0.3 

    // convert y-position to downward pull progress (percentage) 
    let translation = sender.translationInView(Mview.view) 
    let verticalMovement = translation.y/UIScreen.mainScreen().bounds.height 
    let downwardMovement = fmaxf(Float(verticalMovement), 0.0) 
    let downwardMovementPercent = fminf(downwardMovement, 1.0) 
    let progress = CGFloat(downwardMovementPercent) 

    guard let interactor = interactors else { return } 

    switch sender.state { 
    case .Began: 

     interactor.hasStarted = true 
     self.presentViewController(Mview, animated: true, completion: nil) 
    case .Changed: 
     interactor.shouldFinish = progress > percentThreshold 
     interactor.updateInteractiveTransition(progress) 
    case .Cancelled: 
     interactor.hasStarted = false 
     interactor.cancelInteractiveTransition() 
    case .Ended: 
     interactor.hasStarted = false 
     if !interactor.shouldFinish { 
      interactor.cancelInteractiveTransition() 
     } else { 
      interactor.finishInteractiveTransition() 
     }  default: 
     break 
    } 
} 

}

拡張のViewController:UIViewControllerTransitioningDelegate { FUNCのanimationControllerForDismissedController(却下:のUIViewController) - > UIViewControllerAnimatedTransitioning? { 戻りDismissAnimator() }

func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 
    return interactor.hasStarted ? interactor : nil 
} 

func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    return PresentAnimator() 
} 
func interactionControllerForPresentation(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 
    return interactor.hasStarted ? interactor : nil 
} 

}

class PresentAnimator: NSObject { 

}

拡張PresentAnimator:UIViewControllerAnimatedTransitioning { FUNCのtransitionDuration(transitionContext:UIViewControllerContextTransitioning) - > NSTimeInterval { リターン1.0 }

func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 
    guard 

     let fromVC2 = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey), 
    let toVC2 = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey), 
     let containerView2 = transitionContext.containerView() else {return} 

    let initialFrame = transitionContext.initialFrameForViewController(fromVC2) 
    toVC2.view.frame = initialFrame 
    toVC2.view.frame.origin.y = -initialFrame.height * 2 


    containerView2.addSubview(fromVC2.view) 
    containerView2.addSubview(toVC2.view) 

    let screenbounds = UIScreen.mainScreen().bounds 
    let Stage = CGPoint(x: 0, y: 0) 
    let finalFrame = CGRect(origin: Stage, size: screenbounds.size) 

    UIView.animateWithDuration(transitionDuration(transitionContext), animations: { 
     toVC2.view.frame = finalFrame 
     }, completion: { _ in transitionContext.completeTransition(!transitionContext.transitionWasCancelled()) 
    } 
    ) 



} 

}

class ModalViewController: UIViewController { 

let interactors = Interactor() 
var interactor:Interactor? = nil 

@IBAction func close(sender: UIButton) { 
    dismissViewControllerAnimated(true, completion: nil) 
} 




@IBAction func handleGesture(sender: UIPanGestureRecognizer) { 

    let percentThreshold:CGFloat = 0.3 

    // convert y-position to downward pull progress (percentage) 
    let translation = sender.translationInView(self.view) 
    let verticalMovement = translation.y/-view.bounds.height * 2 
    let downwardMovement = fmaxf(Float(verticalMovement), 0.0) 
    let downwardMovementPercent = fminf(downwardMovement, 1.0) 
    let progress = CGFloat(downwardMovementPercent) 

    guard let interactor = interactor else { return } 

    switch sender.state { 
    case .Began: 
     interactor.hasStarted = true 
     dismissViewControllerAnimated(true, completion: nil) 
    case .Changed: 
     interactor.shouldFinish = progress > percentThreshold 
     interactor.updateInteractiveTransition(progress) 
    case .Cancelled: 
     interactor.hasStarted = false 
     interactor.cancelInteractiveTransition() 
    case .Ended: 
     interactor.hasStarted = false 
     if !interactor.shouldFinish { 
      interactor.cancelInteractiveTransition() 
     } else { 
      interactor.finishInteractiveTransition() 
     }  default: 
     break 
    } 
} 

}

import UIKit 

クラスDismissAnimator:NSObjectの{ }

拡張DismissAnimator:UIViewControllerAnimatedTransitioning { FUNCのtransitionDuration(transitionContext:UIViewControllerContextTransitioning) - > NSTimeインターバル{ リターン1.0 }

func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 
    guard 
     let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey), 
     let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey), 
     let containerView = transitionContext.containerView() 
     else { 
      return 
    } 

    containerView.insertSubview(toVC.view, belowSubview: fromVC.view) 

    let screenBounds = UIScreen.mainScreen().bounds 
    let topLeftCorner = CGPoint(x: 0, y: -screenBounds.height * 2) 
    let finalFrame = CGRect(origin: topLeftCorner, size: screenBounds.size) 

    UIView.animateWithDuration(
     transitionDuration(transitionContext),animations: {fromVC.view.frame = finalFrame}, 
     completion: { _ in transitionContext.completeTransition(!transitionContext.transitionWasCancelled()) 
     } 
    ) 

     } 

}

+0

あなたは今まで、これはIVEはこのことを理解しようとして動作するように手に入れました私自身 – user6520705

答えて

1

あなたはUIViewControllers切り替えるためのシンプルなパンジェスチャーをしたい場合、あなたはこれをチェックすることができます

http://www.appcoda.com/custom-segue-animations/

あなたはそれをしたい場合インタラクティブにするには、移行全体を完了することなくVC間を行き来できるので、これをチェックアウトすることをお勧めします:

https://www.youtube.com/watch?v=3jAlg5BnYUU

あなたはさらに行くとカスタム棄却アニメーションを持つようにしたい場合はは、このよりもう探す必要はありません:

https://www.raywenderlich.com/110536/custom-uiviewcontroller-transitions

関連する問題