自定义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)
}
效果如下:
record.gif