BookController in iOS 5 Developer's Cookbook (Erica Sadun) does not start correctly in landscape mode

StackOverflow https://stackoverflow.com/questions/8374226

Question

The problem I'm trying to solve:

I used chapter 05 example 06 BookController in chapter 5 (C05/06-Scrubbing Pages in https://github.com/erica/iOS-5-Cookbook.git ) in a project that have a UInavigatioController as rootViewController, but it does not start correctly in landscape mode. If you rotate the device portrait and return to landscape it begins to work.

To show the bug modify the example test bed delegate in main.c with the following:

#pragma mark Application Setup
@interface TestBedAppDelegate : NSObject <UIApplicationDelegate>
{
    UIWindow *window;
}
@end
@implementation TestBedAppDelegate

TestBedViewController *tbvc;
UINavigationController *navigationController;

- (void) pushBookController: (UIGestureRecognizer *) recognizer
{
    [navigationController pushViewController:tbvc animated:YES];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{   
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    tbvc = [[TestBedViewController alloc] init];

    UIViewController *start = [tbvc controllerWithColor:[UIColor whiteColor] withName:@"white"];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pushBookController:)];
    [start.view addGestureRecognizer:tap];

    navigationController = [[UINavigationController alloc] initWithRootViewController:start];

    window.rootViewController = navigationController;
    [window makeKeyAndVisible];
    return YES;
}
@end

My application starts landscape, so the problem is that the book controller does not recognize landscape mode at start (if you rotate after start it will work). Try it.

To recognize landscape at start, substitute in BookController the following method

// Entry point for external move request
- (void) moveToPage: (uint) requestedPage
{
    //[self fetchControllersForPage:requestedPage orientation:(UIInterfaceOrientation)[UIDevice currentDevice].orientation];
    [self fetchControllersForPage:requestedPage orientation:self.interfaceOrientation];
}

and add the following:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {return YES;}

Now the problem is that BookController does not appear at start, but again if you rotate it begins to work.

Was it helpful?

Solution

probably you solved this already, but try changing the Book's instantiation like this:

+ (id) bookWithDelegate: (id) theDelegate
{   

    NSDictionary *options = nil;
    //Check the orientation
    if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
        //Setting Spine Location to middle for Landscape orientation
        options =  [NSDictionary dictionaryWithObject:
                    [NSNumber numberWithInteger:UIPageViewControllerSpineLocationMid]
                                           forKey: UIPageViewControllerOptionSpineLocationKey];
    }

    BookController *bc = [[BookController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options];

    bc.dataSource = bc;
    bc.delegate = bc;
    bc.bookDelegate = theDelegate;

    return bc;
}

Note that I'm adding a statusBarOrientation check to set the spine.

Basically what you need is to check the orientation when you're creating the UIPageViewController, and I used the statusBarOrientation.

Oh, and don't forget to ensure you're getting the right orientation

- (BOOL) useSideBySide: (UIInterfaceOrientation) orientation
{
    BOOL isLandscape = UIInterfaceOrientationIsLandscape(orientation);
    // in case the UIInterfaceOrientation is 0.
    if (!orientation) {
        isLandscape = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]);
    }
    return isLandscape;    
}

ps: The bookWithDelegate method corresponds to the BookController class within the example mentioned in the question.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top