I put a project called MPFlipViewController up on GitHub. It’s a page-flipping container view controller that allows the user to flip through a series of view controllers as if they were pages in a book. It is based on the MPFlipTransition class I already have on GitHub, but instead of being just a transition between 2 views, it is a full-fledged container view controller that supports panning and swiping between pages (child view controllers). It follows the Containment API introduced in iOS 5, so it behaves as a proper container view controller similar to the system container controllers (e.g. UINavigationController, UITabBarController and UIPageViewController).
Requirements
Xcode 4.3
iOS 5
ARC
API
The API is based on the API for UIPageViewController (since they fulfill an almost identical role). There is a data source protocol that you implement to specify the previous and next pages, and a delegate protocol that you implement in order to receive feedback on whether or not a page-turn operation completed and also to optionally specify the new orientation in the event that device orientation changes (i.e. user rotates the device).
Use
To create a flip controller use the initWithOrientation:
method and pass in the desired orientation (horizontal or vertical):
- (id)initWithOrientation:(MPFlipViewControllerOrientation)orientation;
To set the content use the setViewController:direction:animated:completion:
method where direction indicates whether the animation should be a page flip forward or backward.
- (void)setViewController:(UIViewController *)viewController direction:(MPFlipViewControllerDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL finished))completion;
To enable touch gestures (panning and swiping between pages) implement the MPFlipViewControllerDataSource delegate to provide the previous and next pages (if any). Return nil for either method to indicate the user is already on the first or last page.
- (UIViewController *)flipViewController: (MPFlipViewController *)flipViewController viewControllerBeforeViewController: (UIViewController *)viewController; - (UIViewController *)flipViewController: (MPFlipViewController *)flipViewController viewControllerAfterViewController: (UIViewController *)viewController;
To be notified of whether a page turn animation completed or not, set the MPFlipViewControllerDelegate and implement the optional flipViewController:didFinishAnimating:previousViewController:transitionCompleted:
method. This method is only called if the page turn was gesture-driven (i.e. in response to a pan or swipe), and not programmatic (i.e. in response to a call to setViewController:direction:animated:completion:).
- (void)flipViewController:(MPFlipViewController *)flipViewController didFinishAnimating:(BOOL)finished previousViewController:(UIViewController *)previousViewController transitionCompleted:(BOOL)completed;
To change the orientation of the flip controller when device orientation changes, set the MPFlipViewControllerDelegate and implement the optional flipViewController:orientationForInterfaceOrientation:
method and return the desired orientation.
- (MPFlipViewControllerOrientation)flipViewController: (MPFlipViewController *)flipViewController orientationForInterfaceOrientation: (UIInterfaceOrientation)orientation;
Demo Project
The GitHub project includes a sample project that demonstrates the use of the control and its API.