Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

AltStyle によって変換されたページ (->オリジナル) /