自定义presentViewController

自定义presentViewController关键步骤如下:##

  • 1.在将要被弹出的VC的初始化函数中添加如下代码
class CustomPresentViewController : UIViewController {
   override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
     
     self.transitioningDelegate = self
     self.definesPresentationContext = true
     self.providesPresentationContextTransitionStyle = false
     self.modalPresentationStyle = .Custom
  }
}

注意,以上四行必须在初始化中添加,不能添加在viewDidLoad函数

  • 2.定义弹出和消失的动画类
    弹出(present)动画可以参照如下代码
class CustomViewControllerPresentAnimator : NSObject, UIViewControllerAnimatedTransitioning {
    //动画持续时间
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.3
    }
    
    //动画执行的方法
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        
        let finalToViewPosition = transitionContext.finalFrameForViewController(toVC!)
        
        let containerView = transitionContext.containerView()
        containerView?.addSubview(toVC!.view)
        
        let duration = self.transitionDuration(transitionContext)
        toVC?.view.frame = finalToViewPosition
        
        toVC!.view.transform = CGAffineTransformMakeScale(0.1, 0.1)
        
        UIView.animateWithDuration(
            duration,
            animations: {
                toVC!.view.transform = CGAffineTransformIdentity
        })
        { _ in
            transitionContext.completeTransition(true)
        }
    }
    
    func animationEnded(transitionCompleted: Bool)
    {
        
    }
}

消失(dismiss)动画可以参照如下代码:

class CustomControllerDismissAnimator : NSObject, UIViewControllerAnimatedTransitioning {
    //动画持续时间
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.3
    }
    
    //动画执行的方法
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
        let duration = self.transitionDuration(transitionContext)
        
        UIView.animateWithDuration(
            duration,
            animations: {
                fromVC!.view.transform = CGAffineTransformMakeScale(0.001, 0.001)
        })
        { _ in
            fromVC?.view.removeFromSuperview()
            transitionContext.completeTransition(true)
        }
    }
    
    func animationEnded(transitionCompleted: Bool)
    {
        
    }
}

3.被弹出的VC实现UIViewControllerTransitioningDelegate协议
可以参照如下代码:

extension CustomPresentViewController : UIViewControllerTransitioningDelegate {
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning?
    {
         // 返回弹出动画
        return CustomViewControllerPresentAnimator()
    }
    
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
    {
         // 返回消失动画
        return CustomControllerDismissAnimator()
    }
}

万事俱备

@IBAction func doTest(sender: AnyObject) {
    let vc = CustomPresentViewController(nibName: nil, bundle: nil)
    
    presentViewController(vc,
                          animated: true,
                          completion: nil)
}

效果如下:

自定义presentViewController_第1张图片
record.gif

Demo地址##

你可能感兴趣的:(自定义presentViewController)