19.2_创建自定义的Present或Dismiss动画
想要让你的App拥有独一无二的转场动画吗?🎉 别担心,自定义Present/Dismiss动画就是你的秘密武器!它能让你完全掌控视图控制器出现和消失的方式,打造令人惊艳的用户体验。准备好开始了吗?让我们一起深入探索吧!
协议与对象
首先,你需要了解几个关键的协议和对象。UIViewControllerTransitioningDelegate 协议负责提供转场动画所需的动画控制器和交互控制器。你需要实现这个协议,告诉系统如何执行Present和Dismiss动画。
UIViewControllerAnimatedTransitioning 协议定义了动画控制器的行为。你需要创建一个类,遵循这个协议,并实现 transitionDuration(using:) 和 animateTransition(using:) 方法。前者定义动画的持续时间,后者则负责执行实际的动画。
实现动画控制器
现在,让我们创建一个自定义的动画控制器。这个类需要遵循 UIViewControllerAnimatedTransitioning 协议。在 animateTransition(using:) 方法中,你可以使用 UIView.animate(withDuration:animations:) 方法来创建各种动画效果,例如淡入淡出、缩放、平移等等。
class CustomPresentAnimator: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5 // 动画持续时间
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
// 获取目标视图控制器和容器视图
let toViewController = transitionContext.viewController(forKey: .to)!
let containerView = transitionContext.containerView
// 设置初始状态
toViewController.view.alpha = 0
// 添加目标视图到容器视图
containerView.addSubview(toViewController.view)
// 执行动画
UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
toViewController.view.alpha = 1
}) { (finished) in
// 动画完成,通知系统
transitionContext.completeTransition(finished)
}
}
}实现Transitioning Delegate
接下来,你需要创建一个类,遵循 UIViewControllerTransitioningDelegate 协议。在这个类中,你需要实现 animationController(forPresented:presenting:source:) 和 animationController(forDismissed:) 方法,分别返回Present和Dismiss动画的动画控制器。
class CustomTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return CustomPresentAnimator() // 返回Present动画控制器
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return CustomDismissAnimator() // 返回Dismiss动画控制器
}
}应用自定义转场
最后,你需要将自定义的Transitioning Delegate应用到你的视图控制器上。在Present视图控制器之前,设置其 transitioningDelegate 属性为你的自定义Delegate,并设置 modalPresentationStyle 为 .custom。
let viewController = YourViewController()
viewController.transitioningDelegate = customTransitioningDelegate
viewController.modalPresentationStyle = .custom
present(viewController, animated: true, completion: nil)现在,当你Present或Dismiss这个视图控制器时,就会使用你自定义的动画效果啦!是不是很酷?😎
更多可能性
自定义Present/Dismiss动画的可能性是无限的!你可以尝试各种不同的动画效果,例如:
- 缩放动画: 让视图控制器从小变大,或者从大变小。
- 滑动动画: 让视图控制器从屏幕边缘滑入或滑出。
- 翻转动画: 让视图控制器像翻书一样翻转。
记住,大胆尝试,发挥你的创意!💪 相信你一定能创造出令人惊艳的转场动画!