发布之前,我进行了很多搜索,但没有成功:

我有UIPageViewController,带有UIViewController和PageCurl数组作为过渡。

每个UIViewController都由UIScrollViewUIWebView组成。

加载内容后根据WebView高度计算的滚动高度。

现在,当我加载UIPageViewController并开始在UIViewController之间导航时,无需滚动内容,一切正常。但是,如果我滚动了任何页面,然后导航到下一页或上一页。它将重新显示同一页面,然后再次正常工作。

我已经在IOS7和IOS8上对其进行了测试:

UIPageViewController viewDidLoad方法:

    self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
NSArray *viewControllers = [NSArray arrayWithObject:currentViewController];

    [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

self.pageController.doubleSided = NO;

[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];

视图控制器webViewDidFinishLoad:
CGSize contentSize = aWebView.scrollView.contentSize;
webView.frame = CGRectMake(0, 312, contentSize.width, contentSize.height);
scrollView.contentSize = CGSizeMake(320.f, contentSize.height+60);

编辑
这是UIPageViewController的 viewControllerBeforeViewController viewControllerAfterViewController 的完整代码
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {

    NSUInteger index = [(NewsDetailVC *)viewController index];
    self.index = index;
    NSLog(@"view before %i", index);
    if (index <= 0) {
        return nil;
    }

    index--;
    currentViewController = [self viewControllerAtIndex:index];
    return [self viewControllerAtIndex:index];

}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
    NSUInteger index = [(NewsDetailVC *)viewController index];
    NSLog(@"view after %i", index);

    if (index >= self.newsList.count -1) {
        return nil;
    }
    index++;
    currentViewController =[self viewControllerAtIndex:index];
    return [self viewControllerAtIndex:index];
}

编辑2
上一页是包含UITableView的UIViewController,当单击单元格时,会将Items数组传递给UIPageViewController和选定的索引。
currentViewController的目的是因为我拥有字体大小和当前视图背景的控件。
UIPageViewController的父级是UIViewController
这是viewControllerAtIndex的代码:
- (NewsDetailVC *)viewControllerAtIndex:(NSUInteger)index {

    NewsDetailVC *childViewController = [[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"NewsDetailVC"];
    childViewController.index = index;
    childViewController.selectedNews = [self.newsList objectAtIndex:index ];
    childViewController.selectedCategory = self.selectedCategory;
    return childViewController;
}

最佳答案

我在UIPageViewController上遇到了同样的问题。

似乎在viewControllerAtIndex中显示的索引不是一个准确的索引。

正如上面评论中其他人提到的那样,在这种情况下,您应该实现委托方法pageViewController:willTransitionToViewControllers。

使用这种方法,您应该执行以下工作:

- (void)pageViewController:(UIPageViewController *)pageViewController
willTransitionToViewControllers:(NSArray *)pendingViewControllers {

    if ([pendingViewControllers count] > 0) {
        NSUInteger index = [(PageContentViewController *)
        [pendingViewControllers objectAtIndex:0] pageIndex];

    if (index == [yourArray count] - 1 || index == 0) {
      [self loadContent];
    } else {
      [self doOtherStuff];
    }
  }
}

不知何故,多次调用了viewControllerAtIndex *,这给查找索引带来了麻烦,但是在这种方法中,索引应该是准确的。

希望能帮助到你!

10-07 19:49
查看更多