- 最简洁的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)
}
}
