iOS - 控制器自定义动画跳转 [模态跳转]

57 篇文章 1 订阅
参考资料:

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 过渡代理

这里设置 presenteddismissed 时各自的动画转换类,可以设置为不同的类


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)
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值