ios5 - 在横向视图中在页面视图控制器中翻页

时间:2012-01-24 01:35:19

标签: ios storyboard uipageviewcontroller

我在我的应用程序中使用UIPageViewController和故事板 在纵向时,我正在使用以下代码从一个页面跳到另一个页面并且它正常工作。

int direction = UIPageViewControllerNavigationDirectionForward;
if ([self.modelController currentPage] < pagenum)
{
    direction = UIPageViewControllerNavigationDirectionForward;
}
else if ([self.modelController currentPage] > pagenum)
{
    direction = UIPageViewControllerNavigationDirectionReverse;
}

[self.pageViewController setViewControllers:[NSArray arrayWithObject:[self.modelController viewControllerAtIndex:pagenum storyboard:self.storyboard]] direction:direction animated:YES completion:NULL];    

但是当我们处于横向模式时,相同的代码无效。如何在风景中翻页?

1 个答案:

答案 0 :(得分:3)

如果您查看Xcode中的基于页面的应用程序模板,您会发现以下UIPageViewControllerDelegate方法:

- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
    if (UIInterfaceOrientationIsPortrait(orientation)) {
        // In portrait orientation: Set the spine position to "min" and the page view controller's view controllers array to contain just one view controller. Setting the spine position to 'UIPageViewControllerSpineLocationMid' in landscape orientation sets the doubleSided property to YES, so set it to NO here.
        UIViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex:0];
        NSArray *viewControllers = [NSArray arrayWithObject:currentViewController];
        [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

        self.pageViewController.doubleSided = NO;
        return UIPageViewControllerSpineLocationMin;
    }

    // In landscape orientation: Set set the spine location to "mid" and the page view controller's view controllers array to contain two view controllers. If the current page is even, set it to contain the current and next view controllers; if it is odd, set the array to contain the previous and current view controllers.
    DataViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex: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 = [NSArray arrayWithObjects:currentViewController, nextViewController, nil];
    } else {
        UIViewController *previousViewController = [self.modelController pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController];
        viewControllers = [NSArray arrayWithObjects:previousViewController, currentViewController, nil];
    }
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];


    return UIPageViewControllerSpineLocationMid;
}

当从上面的方法返回UIPageViewControllerSpineLocationMid时,你告诉UIPageViewController它应该期望并排显示两个UIViewControllers (即两页)。

这里的关键是你在调用UIPageViewController的setViewControllers时必须传递正确数量的UIViewControllers:direction:animated:completion:方法。

  • 显示两页?传递两个UIViewControllers。
  • 显示一个页面?传递一个UIViewController。

您提供的代码永远不会将多个UIViewController传递给UIPageViewController。

如果UIPageViewControllerSpineLocation与您传递的UIViewControllers数量不对应,它将崩溃或者什么都不做。

如果您需要进一步的帮助,请告诉我。