- 最简洁的API 实现任何自定义转场动画
- 清晰的Interface
import UIKit class ScaleTransitionAnimation: FSTransitionAnimationProtocol { var snapToView: UIView? var snapFromView: UIView? func setToAnimation(_ fromView: UIView, toView: UIView, containerView: UIView, animationComplete: @escaping (() -> ())) { // 在这里完成你的进场动画 } func backToAnimation(_ fromView: UIView, toView: UIView, containerView: UIView, animationComplete: @escaping (() -> ())) { // 在这里完成你的退场动画 } }
下面我们添加一些简单的缩放动画
import UIKit class ScaleTransitionAnimation: FSTransitionAnimationProtocol { func setToAnimation(_ fromView: UIView, toView: UIView, containerView: UIView, animationComplete:@escaping (() -> ())) { guard let snapToView = snapToView else { return } guard let snapFromView = snapFromView else { return } containerView.addSubview(snapToView) containerView.addSubview(snapFromView) snapFromView.layer.transform = CATransform3DIdentity UIView.animate(withDuration: 0.6, animations: { snapFromView.layer.transform = CATransform3DMakeScale(0.1, 0.1, 1) }) { (finish) in animationComplete() } } func backToAnimation(_ fromView: UIView, toView: UIView, containerView: UIView, animationComplete:@escaping (() -> ())) { guard let snapToView = snapToView else { return } guard let snapFromView = snapFromView else { return } containerView.addSubview(snapFromView) containerView.addSubview(snapToView) snapToView.layer.transform = CATransform3DMakeScale(0.1, 0.1, 1) UIView.animate(withDuration: 0.6, animations: { snapToView.layer.transform = CATransform3DIdentity }) { (finish) in animationComplete() } } }
@IBAction func onPushAnimation(_ sender: Any) { let animation = ScaleTransitionAnimation() let vc = ScaleSecondViewController.init(nibName: "ScaleSecondViewController", bundle: nil) self.fs_pushViewController(vc, animation: animation) }
注册手势转场
override func viewDidLoad() { super.viewDidLoad() fs_registerToInteractiveTransition([.left]) {[weak self] in let animation = OpenDoorTranstionAnimation() let vc = OpenDoorSecondViewController.init(nibName: "OpenDoorSecondViewController", bundle: nil) self?.fs_pushViewController(vc, animation: animation) } }
注册手势退场
class InteractiveViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() fs_registerBackInteractiveTransition([.right]) { self.navigationController?.popViewController(animated: true) } } }
想要在中间区域 响应手势的时候 我们需要设置 .leftOffset( CGFloat )
override func viewDidLoad() { super.viewDidLoad() fs_registerToInteractiveTransition([.leftOffset(view.frame.width / 2.0), .rightOffset(view.frame.width / 2.0)]) { let animation = OpenMiddleTranstionAnimation() let vc = OpenMiddleSecondViewController.init(nibName: "OpenMiddleSecondViewController", bundle: nil) self.fs_pushViewController(vc, animation: animation) } }
注册左右两边区域为返回的响应区域
override func viewDidLoad() { super.viewDidLoad() fs_registerBackInteractiveTransition([.left, .right]) { self.navigationController?.popViewController(animated: true) } }