Skip to content

AllenLiberty/FSTransition

Repository files navigation

FSTransition

目标:这大概是最简洁的 转场动画 库了

  • 最简洁的API 实现任何自定义转场动画
  • 清晰的Interface

结果演示

markdown! markdown!

使用

1. 创建一个动画实现类 遵循FSTransitionAnimationProtocol协议

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

2. 外部调用

2.1 非手势转场调用

 @IBAction func onPushAnimation(_ sender: Any) {
        let animation = ScaleTransitionAnimation()
        let vc = ScaleSecondViewController.init(nibName: "ScaleSecondViewController", bundle: nil)
        self.fs_pushViewController(vc, animation: animation)
    }

2.2 手势转场调用

注册手势转场

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

2.3 手势转场设置手势响应区域

想要在中间区域 响应手势的时候 我们需要设置 .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)
        }
    }

About

transition, second floor, navigation transition, open door

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors