自定義presentViewController關(guān)鍵步驟如下:##
- 1.在將要被彈出的VC的初始化函數(shù)中添加如下代碼
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函數(shù)
- 2.定義彈出和消失的動(dòng)畫(huà)類(lèi)
彈出(present)動(dòng)畫(huà)可以參照如下代碼
class CustomViewControllerPresentAnimator : NSObject, UIViewControllerAnimatedTransitioning {
//動(dòng)畫(huà)持續(xù)時(shí)間
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.3
}
//動(dòng)畫(huà)執(zhí)行的方法
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)動(dòng)畫(huà)可以參照如下代碼:
class CustomControllerDismissAnimator : NSObject, UIViewControllerAnimatedTransitioning {
//動(dòng)畫(huà)持續(xù)時(shí)間
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.3
}
//動(dòng)畫(huà)執(zhí)行的方法
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實(shí)現(xiàn)UIViewControllerTransitioningDelegate協(xié)議
可以參照如下代碼:
extension CustomPresentViewController : UIViewControllerTransitioningDelegate {
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
// 返回彈出動(dòng)畫(huà)
return CustomViewControllerPresentAnimator()
}
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
// 返回消失動(dòng)畫(huà)
return CustomControllerDismissAnimator()
}
}
萬(wàn)事俱備
@IBAction func doTest(sender: AnyObject) {
let vc = CustomPresentViewController(nibName: nil, bundle: nil)
presentViewController(vc,
animated: true,
completion: nil)
}
效果如下:
record.gif