将UIPageViewController嵌套在UINavigationController中仅显示一页

3

我已经花了几个小时,但仍然无法使其正常工作。希望有人能帮助我。

我有一个 UIPageViewController,在应用程序启动时将其添加到默认视图中,它可以完美地工作。我的操作如下:

//Step 1
//Instantiate the UIPageViewController.
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl
                                                          navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

//Step 2:
//Assign the delegate and datasource as self.
self.pageViewController.delegate = self;
self.pageViewController.dataSource = self;

//Step 3:
//Set the initial view controllers.
ContentViewController *contentViewController = [[ContentViewController alloc] initWithNibName:@"ContentViewController" bundle:nil];
contentViewController.labelContents = [self.modelArray objectAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:contentViewController];
[self.pageViewController setViewControllers:viewControllers
                                  direction:UIPageViewControllerNavigationDirectionForward
                                   animated:NO
                                 completion:nil];


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

现在我想在我的初始视图中使用导航控制器,当用户点击按钮时将UIPageViewController推入堆栈。这个也起作用,但是当我处于横向模式时,UIPageViewController仅显示一页(水平伸展),而不是应该显示的两页。我需要旋转设备到纵向,然后再回到横向模式,才能强制UIPageViewController显示两个页面。 我使用以下代码将UIPageViewController添加到导航控制器中:

[self.navController pushViewController:self.pageViewController animated:NO];

当我调试我的代码时,我发现没有导航控制器时,UIPageViewController的委托方法在启动时被调用。当我将UIPageViewController推入导航控制器中时,直到我旋转设备它们才会被调用。有人知道如何解决这个问题吗?感谢您提供任何帮助/提示。
1个回答

3

这个帖子的帮助下,我找到了解决方法。

关键是在创建pageViewController时通过选项字典设置spineLocation:

    options = [NSDictionary dictionaryWithObject: [NSNumber numberWithInteger:UIPageViewControllerSpineLocationMid]
                                          forKey: UIPageViewControllerOptionSpineLocationKey];

这个选项应该放在一个检查中,以查看当前的界面方向。

在上面提到的线程中,通过三元运算符检查接口方向;我将其放入if语句中,以便在同一机会下将额外的UIViewController添加到viewControllers数组中。

如果界面方向是纵向的,则在创建pageViewController时'options'仍然为空,因此它将继续以纵向模式创建,并且只有一个viewController。

这是我在BookViewController中的整个viewDidLoad代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    _modelController = [[ModelController alloc] init];

    DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0
                                                                                  storyboard:self.storyboard];

    NSMutableArray *viewControllers = [NSMutableArray arrayWithObjects:
                                startingViewController,
                                nil];
    NSDictionary *options;
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {

        DataViewController *secondViewController = [self.modelController viewControllerAtIndex:1
                                                                                    storyboard:self.storyboard];

        [viewControllers addObject:secondViewController];

        options = [NSDictionary dictionaryWithObject: [NSNumber numberWithInteger:UIPageViewControllerSpineLocationMid]
                                              forKey: UIPageViewControllerOptionSpineLocationKey];
    }

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

    [self.pageViewController setViewControllers:viewControllers
                                      direction:UIPageViewControllerNavigationDirectionForward
                                       animated:NO
                                     completion:NULL];

    self.pageViewController.dataSource = self.modelController;

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

    // Set the page view controller's bounds
    self.pageViewController.view.frame = self.view.bounds;

    [self.pageViewController didMoveToParentViewController:self];

    // Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.
    self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接