iOS6的自转 - UIPageViewController

问题描述:

我的UI结构:iOS6的自转 - UIPageViewController

UINavigationController 
--UIViewController(first) 
| 
|Modal 
| 
V 
UINavigationController (subclass) 
--UIViewController (contains UIPageViewController) 

对于iOS6的新自转,我创建的UINavigationController的一个子类,并补充说:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return UIInterfaceOrientationIsPortrait(interfaceOrientation); 
} 

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

只想保持方向为纵向。

我初始化UIPageViewController这样的:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 

    PageDataViewController *startingViewController = [self viewControllerAtIndex:start storyboard:self.storyboard]; 

    NSArray *viewControllers = [NSArray arrayWithObject:startingViewController]; 
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL]; 

    self.pageViewController.dataSource = self; 

    [self addChildViewController:self.pageViewController]; 
    [self.view addSubview:self.pageViewController.view]; 

    // Set the page view controller's bounds using an inset rect so that self's view is visible around the edges of the pages. 
    CGRect pageViewRect = self.view.bounds; 
    self.pageViewController.view.frame = pageViewRect; 

    [self.pageViewController didMoveToParentViewController:self]; 

然后我进行模态SEGUE, 如果第一个的UIViewController是纵向的pageViewController工作, 但如果第一次的UIViewController是风景,我总是有例外:

*在声明失败 - [UIPageViewController willAnimateRotationToInterfaceOrientation:持续时间:], /SourceCache/UIKit_Sim/UIKit的-2372/UIPageViewController.m:945 终止应用程序由于未捕获的异常 'NSInternalInconsistencyException',原因是: '没有视图控制器' * *第一掷调用堆栈:(0x2a5e012 0x19bae7e 0x2a5de78 0x1450f35 0xd75974 0x9f12b4 0x9f13ea 0x9e4c32 0x9f1372 0x9f13ea 0x9e4c32 0x9f1372 0x9f1751 0x93a1a6 0xbee5f9 0x9ec4f3 0x9ec777 0x9ec7b7 0xd57fe2 0xd49ad9 0xd49b54 0x9b1899 0x9b1b3d 0x13b8e83 0x2a1d376 0x2a1ce06 0x2a04a82 0x2a03f44 0x2a03e1b 0x2c967e3 0x2c96668 0x90265c 0xea7d 0x2685为0x1)的libC++ abi.dylib:终止称为抛出异常

在约“supportedInterfaceOrientations”的文档被写入:

当用户改变设备方向时,系统调用根视图控制器上或填充所述窗口该方法中,最上面的呈现视图控制器

您是否尝试将主窗口的rootViewController设置为您当前的NavigationController类?

就像在AppDelegate中:

self.window.rootViewController = nvc; 

当你的navigationController正在发生变化,请重新设置RootViewController的...

+0

谢谢,它将nvc设置为根控制器后工作。 –

+0

优秀!别客气! – iMathieuB

其实是有它的另一个解决方案。

只要调用willAnimateRotationToInterfaceOrientation方法到rootViewController的旋转,就必须实现它的方法。

@interface UIPageViewController (Rotation) 
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 
@end 

//实现文件

#import "UIPageViewController+Rotation.h" 

@implementation UIPageViewController(Rotation) 
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {} 
@end 

我有“固定”的问题,在viewWillAppear:视图控制器设置为UIPageViewController再次,因为当这个方法被调用,用于页面视图控制器脊骨位置是正确并基于该信息我设置一个,或两个页面(查看控制器)

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    if(self.pageViewController.spineLocation == UIPageViewControllerSpineLocationMid) 
    { 
     BookPageViewController *currentViewController = self.pageViewController.viewControllers[0]; 
     NSArray *viewControllers = nil; 

     NSUInteger indexOfCurrentViewController = [self.modelController indexOfViewController:currentViewController]; 
     if (indexOfCurrentViewController == 0 || indexOfCurrentViewController % 2 == 0) { 
      UIViewController *nextViewController = [self.modelController pageViewController:self.pageViewController viewControllerAfterViewController:currentViewController]; 
      viewControllers = @[currentViewController, nextViewController]; 
     } else { 
      UIViewController *previousViewController = [self.modelController pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController]; 
      viewControllers = @[previousViewController, currentViewController]; 
     } 
     [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 
    } 

    if(self.pageViewController.spineLocation == UIPageViewControllerSpineLocationMin) 
    { 
     [self.pageViewController setViewControllers:[NSArray arrayWithObject:[self.pageViewController.viewControllers objectAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 
    } 
} 

并设置如下面

- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation 
{ 
    BookPageViewController *currentViewController = self.pageViewController.viewControllers[0]; 

    if(UIInterfaceOrientationIsPortrait(orientation)) 
    { 
     [self.pageViewController setViewControllers:[NSArray arrayWithObject:currentViewController] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 

     pageViewController.doubleSided = NO; 

     return UIPageViewControllerSpineLocationMin; 
    } 

    if(UIInterfaceOrientationIsLandscape(orientation)) 
    { 
     NSArray *viewControllers = nil; 

     NSUInteger indexOfCurrentViewController = [self.modelController indexOfViewController:currentViewController]; 
     if (indexOfCurrentViewController == 0 || indexOfCurrentViewController % 2 == 0) { 
      UIViewController *nextViewController = [self.modelController pageViewController:self.pageViewController viewControllerAfterViewController:currentViewController]; 
      viewControllers = @[currentViewController, nextViewController]; 
     } else { 
      UIViewController *previousViewController = [self.modelController pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController]; 
      viewControllers = @[previousViewController, currentViewController]; 
     } 
     [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 

     return UIPageViewControllerSpineLocationMid; 
    } 

    return UIPageViewControllerSpineLocationMin; 
} 

我已经“固定”的问题,通过在viewWillAppear中视图控制器设置为UIPageViewController 0委托方法:再次,因为当该方法被调用时,用于页面视图控制器脊骨位置是正确的,并在此基础上信息我设置了一个或两个页面(视图控制器)