Simple full screen image viewer with image zoom custom view controller transition
Objective-C Ruby
Pull request Compare This branch is 2 commits ahead of gonzalezreal:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Vertigo is a simple image viewer which includes a custom view controller transition that mimics the new iOS 7 Photos app image zoom transition effect.

Image zoom transition



Vertigo requires iOS 7 or greater.

From CocoaPods

Add pod 'Vertigo' to your Podfile.


Drag the Vertigo folder into your project. If your project doesn't use ARC you must enable it for all the .m files under the Vertigo folder.


Vertigo includes the following classes:

  • TGRImageViewController is the image viewer itself. The user can double tap on the image to zoom it in or out. A single tap will dismiss the viewer.
  • TGRImageZoomAnimationController is the object that performs the custom transition between your view controller and a TGRImageViewController (that is, the Photos app image zoom transition effect).

To present and dismiss a TGRImageViewController from your view controller using the custom transition effect, your view controller needs to implement the new UIViewControllerTransitioningDelegate protocol and return a TGRImageZoomAnimationController initialized with the image view that will be used as the inital (or final in case of dismissal) point of the transition.

#import "TGRImageViewController.h"
#import "TGRImageZoomAnimationController.h"

@interface MyViewController () <UIViewControllerTransitioningDelegate>

@implementation MyViewController
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
    if ([presented isKindOfClass:TGRImageViewController.class]) {
        return [[TGRImageZoomAnimationController alloc] initWithReferenceImageView:self.imageView];
    return nil;

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    if ([dismissed isKindOfClass:TGRImageViewController.class]) {
        return [[TGRImageZoomAnimationController alloc] initWithReferenceImageView:self.imageView];
    return nil;

- (IBAction)showImageViewer {
    TGRImageViewController *viewController = [[TGRImageViewController alloc] initWithImage:self.imageView.image];
    // Don't forget to set ourselves as the transition delegate
    viewController.transitioningDelegate = self;

    [self presentViewController:viewController animated:YES completion:nil];


Guillermo Gonzalez


Vertigo is available under the MIT license. See LICENSE.