问题: ios presentViewcontroller 时 ,默认的动画 是 从下向上 推出的, 但是 很多 弹框 需要是渐隐渐现 弹出的。那怎么实现渐隐渐现的弹框呢?
方法1 通过系统定制好的动画效果
self.modalPresentationStyle = .custom
//crossDissolve 交叉化;交叉溶解;淡入淡出,弹窗提示信息
self.modalTransitionStyle = .crossDissolve
方法2 自定义动画效果
- 设置AlertViewController 的弹出效果
/// 绑定手机号 提示弹框
class LZAlertViewController: UIViewController {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.modalPresentationStyle = .custom
self.transitioningDelegate = self
}
}
2.设置代理动画
extension LZAlertViewController: UIViewControllerTransitioningDelegate {
//present 渐隐渐现
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> (any UIViewControllerAnimatedTransitioning)? {
return LZFadeControllerAnimation(.present)
}
//present 渐隐渐现
func animationController(forDismissed dismissed: UIViewController) -> (any UIViewControllerAnimatedTransitioning)? {
return LZFadeControllerAnimation(.dismiss)
}
}
3.实现动画效果
import UIKit
/**
present 渐隐渐现
用法:UIViewControllerTransitioningDelegate 实现
animationController(forPresented
animationController(forDismissed
*/
class LZFadeControllerAnimation: NSObject, UIViewControllerAnimatedTransitioning {
enum LZFadeControllerTransitionType: Int {
case present = 0
case dismiss
}
var transiontionType: LZFadeControllerTransitionType? = .present
init(_ transitType: LZFadeControllerTransitionType) {
super.init()
self.transiontionType = transitType
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
guard let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from), let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) else {
return
}
let fromView = fromVC.view
let toView = toVC.view
let duration = self.transitionDuration(using: transitionContext)
guard let transiontionType else {
return
}
if transiontionType == .present {//toVC.isBeingPresented
containerView.addSubview(toView!)
toView?.alpha = 0
UIView.animate(withDuration: duration, delay: 0, options: .curveEaseInOut, animations: {
toView?.alpha = 1
}, completion: { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
})
}
// Dismissal 转场中不要将 toView 添加到 containerView
if transiontionType == .dismiss {//fromVC.isBeingDismissed
let fromViewHeight = fromView?.frame.height
UIView.animate(withDuration: duration, animations: {
fromView?.alpha = 0
}, completion: { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
})
}
}
}