iOS - 控制器自定义动画跳转 [模态跳转]
程序员文章站
2024-03-26 11:38:05
...
参考资料:
Apple 开发文档 Customizing the Transition Animations
WWDC 2013 Custom Transitions Using View Controllers
图例:
跳转的动画有很多,全部可以自定义
创建自定义跳转必须遵循的三个步骤:
- 1、创建一个类,并实现了
UIViewControllerAnimatedTransitioning
协议 - 2、创建一个类作为
UIViewControllerTransitioningDelegate
过渡代理 - 3、在模态跳转前修改控制器的
transitioningDelegate
代理为自定义的代理(步骤2的代理类)
核心代码示例
一、创建一个类,并实现了 UIViewControllerAnimatedTransitioning
协议
这个协议主要控制控制器视图的显示的,通过 transitionContext
可以获取到每个视图和控制器,并进行动画的设置
class AnimatedTransitioning: NSObject {
var isPresenting: Bool = false
}
extension AnimatedTransitioning: UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let fromView = transitionContext.view(forKey: .from)!
let toView = transitionContext.view(forKey: .to)!
let containerView = transitionContext.containerView
if isPresenting {
toView.transform = CGAffineTransform(scaleX: 0, y: 0)
containerView.addSubview(toView)
} else {
containerView.insertSubview(toView, belowSubview: fromView)
}
UIView.animate(withDuration: 0.5, animations: {
if self.isPresenting {
toView.transform = CGAffineTransform.identity
} else {
fromView.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
}
}) { (finished) in
transitionContext.completeTransition(finished)
}
}
}
二、创建一个类作为 UIViewControllerTransitioningDelegate
过渡代理
这里设置 presented
和 dismissed
时各自的动画转换类,可以设置为不同的类
class CustomTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let at = AnimatedTransitioning()
at.isPresenting = true
return at
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let at = AnimatedTransitioning()
at.isPresenting = false
return at
}
}
三、在模态跳转前修改控制器的 transitioningDelegate
代理为自定义的代理
注意:代理不能为局部变量
class ViewController: UIViewController {
// 必须保存为实例变量
var ctDelegate = CustomTransitioningDelegate()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let vc = TempViewController()
vc.transitioningDelegate = ctDelegate
self.present(vc, animated: true, completion: nil)
}
}
上一篇: 构造函数的写法
下一篇: left join on and