发布之前,我进行了很多搜索,但没有成功:
我有UIPageViewController
,带有UIViewController
和PageCurl数组作为过渡。
每个UIViewController
都由UIScrollView
和UIWebView
组成。
加载内容后根据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 *,这给查找索引带来了麻烦,但是在这种方法中,索引应该是准确的。
希望能帮助到你!