1

我在我的应用程序中使用 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];    

但是当我们处于横向模式时,相同的代码不起作用。横屏时如何翻页?

4

1 回答 1

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 它应该期望并排显示两个 UIViewController(即两个页面)。

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

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

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

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

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

于 2012-02-05T21:59:39.300 回答