ZoomTransitioning provides a custom transition with image zooming animation.
When you use this library with UINavigationController, you can pop view controller with edge swiping.


Run the demo project in the Demo directory without carthage update or pod install.


Refer to the example project for details.

import ZoomTransitioning

Adopt ZoomTransitionSourceDelegate to source view controller

extension ImageListViewController: ZoomTransitionSourceDelegate {

    func transitionSourceImageView() -> UIImageView {
        return selectedImageView

    func transitionSourceImageViewFrame(forward forward: Bool) -> CGRect {
        return selectedImageView.convertRect(selectedImageView.bounds, toView: view)

    func transitionSourceWillBegin() {
        selectedImageView.hidden = true

    func transitionSourceDidEnd() {
        selectedImageView.hidden = false

    func transitionSourceDidCancel() {
        selectedImageView.hidden = false

Adopt ZoomTransitionDestinationDelegate to destination view controller

extension ImageDetailViewController: ZoomTransitionDestinationDelegate {

    func transitionDestinationImageViewFrame(forward forward: Bool) -> CGRect {
        if forward {
            let x: CGFloat = 0.0
            let y = topLayoutGuide.length
            let width = view.frame.width
            let height = width * 2.0 / 3.0
            return CGRect(x: x, y: y, width: width, height: height)
        } else {
            return largeImageView.convertRect(largeImageView.bounds, toView: view)

    func transitionDestinationWillBegin() {
        largeImageView.hidden = true

    func transitionDestinationDidEnd(transitioningImageView imageView: UIImageView) {
        largeImageView.hidden = false
        largeImageView.image = imageView.image

    func transitionDestinationDidCancel() {
        largeImageView.hidden = false

set delegate property of UINavigationController

import ZoomTransitioning

class NavigationController: UINavigationController {

    private let zoomNavigationControllerDelegate = ZoomNavigationControllerDelegate()

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        delegate = zoomNavigationControllerDelegate


  • Swift 4.0
  • iOS 9.0 or later

If you use Swift 2.2, use 1.3.0



ZoomTransitioning is available through Carthage. To install it, simply add the following line to your Cartfile:

github "WorldDownTown/ZoomTransitioning"


ZoomTransitioning is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'ZoomTransitioning'


  1. Download and drop /ZoomTransitioningfolder in your project.
  2. Congratulations!


WorldDownTown, [email protected]


ZoomTransitioning is available under the MIT license. See the LICENSE file for more info.