2

我的用户界面结构:

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];

然后我执行 Modal segue,如果第一个 UIViewController 是纵向的,则 pageViewController 可以工作,但是如果第一个 UIViewController 是横向,我总是遇到异常:

* 断言失败 -[UIPageViewController willAnimateRotationToInterfaceOrientation:duration:], /SourceCache/UIKit_Sim/UIKit-2372/UIPageViewController.m:945 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'No view controllers' * * First throw call stack: (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:终止调用抛出异常

4

4 回答 4

4

其实还有另一种解决方案。

旋转只是调用了rootViewController的willAnimateRotationToInterfaceOrientation方法,你必须实现它的方法。

@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
于 2013-04-09T05:36:23.740 回答
2

在有关“supportedInterfaceOrientations”的文档中写道:

当用户更改设备方向时,系统会在根视图控制器或填充窗口的最顶部呈现的视图控制器上调用此方法

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

就像在 AppDelegate 中一样:

self.window.rootViewController = nvc;

当您的 navigationController 发生变化时,再次设置 rootViewController ...

于 2012-09-24T18:16:58.120 回答
0

我已经“修复”了这个问题,通过再次将视图控制器设置为UIPageViewControllerin viewWillAppear:,因为当调用此方法时,页面视图控制器的脊椎位置是正确的,并且基于此信息我设置了一个或两个页面(视图控制器)

- (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];
    }
}

并设置UIPageViewController委托方法如下

- (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;
}
于 2015-10-15T10:55:39.953 回答
0

我通过在 viewWillAppear 中将视图控制器设置为 UIPageViewController 来“解决”了这个问题:再次,因为当调用此方法时,页面视图控制器的脊椎位置是正确的,并且基于此信息我设置了一个或两个页面(视图控制器)

于 2016-10-28T19:16:48.780 回答