AnimatedTransitionKit
It's the very simple library to apply transitioning to between viewcontroller and other viewcontroller
Install / Use
/learn @pisces/AnimatedTransitionKitREADME
AnimatedTransitionKit
- It's the very simple library to apply transitioning to between scene and other scene
Features
- Simple integration of custom transitioning for UIViewController and UINavigationController
- Provides various types of custom transitioning
- Support percent driven interactive transtions
- Expandable
Example

Transition types for UIViewController
- Move
- DragDrop
- Fade
- Zoom
Transition types for UINavigationController
- Move
Gestures
- Pan
- Pinch
Import
Objective-C
#import <AnimatedTransitionKit/AnimatedTransitionKit.h>
Swift
import AnimatedTransitionKit
🔥Using AnimatedTransition
Using ZoomTransition Simply
Using single transition for dismission with pan gesture
import AnimatedTransitionKit
let secondVC = SecondViewController()
secondVC.transition = ZoomTransition()
present(secondVC, animated: true, completion: nil)
Using ZoomTransition Deeply
Using pair transitions for presenting and dismission both with pinch gesture
import AnimatedTransitionKit
final class ZoomTransitionFirstViewController: UIViewController {
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
title = "First View"
// View binding with any transition id
button.transitionItem.id = "zoomTarget"
zoomTransition.prepareAppearance(from: self)
}
// MARK: - Private
private lazy var zoomTransition = ZoomTransition()
@IBOutlet private weak var button: UIButton!
@IBAction private func clicked() {
present(createSecondVC(), animated: true, completion: nil)
}
}
extension ZoomTransitionFirstViewController: InteractiveTransitionDataSource {
func viewController(forAppearing interactor: AbstractInteractiveTransition) -> UIViewController? {
createSecondVC()
}
private func createSecondVC() -> UIViewController {
let rootVC = UIStoryboard(name: "ZoomTransition", bundle: nil).instantiateViewController(withIdentifier: "SecondScene")
let navigationController = UINavigationController(rootViewController: rootVC)
navigationController.transition = zoomTransition
return navigationController
}
}
final class ZoomTransitionSecondViewController: UIViewController {
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
title = "Second View"
navigationItem.setLeftBarButton(UIBarButtonItem(title: "Close", style: .plain, target: self, action: #selector(close)), animated: false)
// View binding with matched transition id
targetView.transitionItem.id = "zoomTarget"
}
// MARK: - Internal
@IBOutlet private(set) weak var targetView: UIView!
// MARK: - Private
@objc private func close() {
dismiss(animated: true, completion: nil)
}
}
Using MoveTransition Simply
Using single transition for dismission with pan gesture
import AnimatedTransitionKit
let secondVC = SecondViewController()
secondVC.transition = MoveTransition()
present(secondVC, animated: true, completion: nil)
Using MoveTransition Deeply
Using pair transitions for presenting and dismission both with pan gesture
import AnimatedTransitionKit
final class MoveTransitionFirstViewController: UIViewController {
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
title = "First View"
moveTransition.prepareAppearance(from: self)
}
// MARK: - Private
private lazy var moveTransition = MoveTransition()
@IBAction private func clicked() {
present(createSecondVC(), animated: true, completion: nil)
}
}
extension MoveTransitionFirstViewController: InteractiveTransitionDataSource {
func viewController(forAppearing interactor: AbstractInteractiveTransition) -> UIViewController? {
createSecondVC()
}
private func createSecondVC() -> UIViewController {
let rootVC = MoveTransitionSecondViewController(nibName: "MoveTransitionSecondView", bundle: .main)
let navigationController = UINavigationController(rootViewController: rootVC)
navigationController.transition = moveTransition
return navigationController
}
}
final class MoveTransitionSecondViewController: UITableViewController {
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
title = "Second View"
navigationItem.setLeftBarButton(UIBarButtonItem(title: "Close", style: .plain, target: self, action: #selector(close)), animated: false)
navigationController?.transition?.disappearenceInteractor?.drivingScrollView = tableView
}
// MARK: - Overridden: UITableViewController
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 50
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "UITableViewCell"
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: identifier)
}
return cell!
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.textLabel?.text = "\(indexPath.row + 1)"
}
// MARK: - Private
@objc private func close() {
dismiss(animated: true)
}
}
// MARK: - InteractiveTransitionDelegate
extension MoveTransitionSecondViewController: InteractiveTransitionDelegate {
func shouldTransition(_ interactor: AbstractInteractiveTransition) -> Bool {
navigationController?.viewControllers.count == 1
}
}
Using DragDropTransition
import AnimatedTransitionKit
final class DragDropTransitionFirstViewController: UIViewController {
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
title = "First View"
view.addGestureRecognizer(gestureRecognizer)
}
// MARK: - Private
@IBOutlet private weak var imageView: UIImageView!
private lazy var gestureRecognizer: UITapGestureRecognizer = { [unowned self] in
UITapGestureRecognizer(target: self, action: #selector(tapped))
}()
@objc private func tapped() {
let secondViewController = DragDropTransitionSecondViewController(nibName: "DragDropTransitionSecondView", bundle: .main)
let secondNavigationController = UINavigationController(rootViewController: secondViewController)
let transition = DragDropTransition()
transition.disappearenceInteractor?.delegate = secondViewController
let w = view.frame.size.width
let statusBarHeight = UIApplication.shared.statusBarFrame.size.height
let navigationBarHeight = navigationController!.navigationBar.frame.size.height
let bigRect = CGRect(x: 0, y: statusBarHeight + navigationBarHeight, width: w, height: w)
let smallRect = imageView.frame
transition.presentingSource = DragDropTransitioningSource.image({ () -> UIImage? in
self.imageView.image
}, from: { () -> CGRect in
smallRect
}, to: { () -> CGRect in
bigRect
}, rotation: { () -> CGFloat in
0
}) {
self.imageView.isHidden = true
secondViewController.imageView.isHidden = false
}
transition.dismissionSource = DragDropTransitioningSource.image({ () -> UIImage? in
secondViewController.imageView.image
}, from: { () -> CGRect in
bigRect
}, to: { () -> CGRect in
smallRect
}, rotation: { () -> CGFloat in
0
}) {
self.imageView.isHidden = false
}
secondNavigationController.transition = transition
navigationController?.present(secondNavigationController, animated: true, completion: nil)
}
}
final class DragDropTransitionSecondViewController: UIViewController {
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
title = "Second View"
edgesForExtendedLayout = .bottom
imageView.isHidden = true
navigationItem.setLeftBarButton(UIBarButtonItem(title: "Close", style: .plain, target: self, action: #selector(close)), animated: false)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
imageViewHeight.constant = view.frame.size.width
}
// MARK: - Internal
@IBOutlet private(set) weak var imageView: UIImageView!
// MARK: - Private
@IBOutlet private weak v
