A dead simple "bookshelf" UIViewController transition for iOS 7.
Read the original blog post.
(If you aren't familiar with the new view controller transitioning API, it's best to start here: http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/)
SMLBookshelfTransitionAnimator provides sensible defaults, you really only need to provide it with views for the left and right sides!
SMLBookshelfTransitionAnimator *animator = [[SMLBookshelfTransitionAnimator alloc] init]; animator.leftView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"left.jpg"]]; animator.rightView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.jpg"]];
Duration, depth, perspective and rotation direction are all customizable options
Because we often create one off animator instances for presenting and dismissing view controllers, a couple of conveniences for automatically swapping the left and right sides are also provided to help aid in the appearance of a seamless, stateful, 3D transition.
###Left, Right, Front, Back
TLDR; Always set the
dismissing property when dismissing a view controller.
By default all directional properties of
rotationDirection) are interpreted from the perspective of the front view. The
leftView is the side to the left of the front view, the
rightView is the side to the right of the front view. When rotating,
SMLBookshelfTransitionLeft rotates toward the left -- that is, the left side will push away from the viewer as the right side rotates toward the viewer.
Front is relative! This can be tricky … by default,
SMLBookshelfTransitionAnimator is intended to be instantiated once for presenting a view controller and again for dismissing it - this cuts down on the need to maintain a bunch of state across your view controllers just so you can have some pretty animations. Because of this, while setting the
dismissing property is optional, it is also highly recommended.
dismissing property is set, the
rightView values are swapped. This means that it is then only necessary to think about directionality from the perspective of the presenting view controller. With this approach, a single convenience method can generate
SMLBookshelfTransitionAnimator instances with no need to juggle properties based on presentation state; we'll handle the juggling for you.
Take a look at the sample app to see how we're handling this there. I think you'll find the code to be much tidier this way.