閑暇時間做轉(zhuǎn)場動畫(自定義不改變frame
的轉(zhuǎn)場動畫)上炎,demo類似如下所示:
自定義模態(tài)
只需要兩步:
- 自定義轉(zhuǎn)場動畫類
- 設(shè)置轉(zhuǎn)場代理
一, 自定義轉(zhuǎn)場動畫類
class CustomAnimation: NSObject {}
二, 設(shè)置轉(zhuǎn)場代理
showVC.modalPresentationStyle = .custom // 背景視圖不被刪除
showVC.transitioningDelegate = customAnimation // 代理動畫UIViewControllerTransitioningDelegate協(xié)議
// 其中闪幽,customAnimation 是一個懶加載屬性涡贱,private lazy var customAnimation = CustomAnimation()
1壶硅,在自定義轉(zhuǎn)場動畫類CustomAnimation
中饱苟,需要遵守UIViewControllerTransitioningDelegate
協(xié)議:
//MARK: - 設(shè)置轉(zhuǎn)場代理
extension CustomAnimation:UIViewControllerTransitioningDelegate{
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
// 彈出之后做事情 isPresent聲明為私有變量即可
isPresent = true
return self
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
// 消失之后做事情
isPresent = false
return self
}
}
2芙粱,由于上方法return self
,所以需要遵守UIViewControllerAnimatedTransitioning
協(xié)議
//MARK: - 自定義動畫屬性
extension CustomAnimation:UIViewControllerAnimatedTransitioning{
// 1 動畫時長
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
// 2 設(shè)置點擊之后是彈出 還是 消失
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
isPresent ? animationPresentedView(transitionContext: transitionContext) : animationDismissedView(transitionContext: transitionContext)
}
func animationPresentedView(transitionContext: UIViewControllerContextTransitioning) {
// 1 取出顯示視圖
let presentView = transitionContext.view(forKey: .to)
// 2 添加到containerView
transitionContext.containerView.addSubview(presentView!);
// 3 添加動畫
presentView?.alpha = 0.0
UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
presentView?.alpha = 1.0
}) { (_) in
transitionContext.completeTransition(true)
}
}
func animationDismissedView(transitionContext: UIViewControllerContextTransitioning) {
// 1 取出消失視圖
let dismissView = transitionContext.view(forKey: .from)
// 2 添加動畫
dismissView?.alpha = 1.0
UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
dismissView?.alpha = 0.0
}) { (_) in
transitionContext.completeTransition(true)
}
}
}