Ios UIPageViewController的行为与Scroll&;不同;页面卷曲
我看到Ios UIPageViewController的行为与Scroll&;不同;页面卷曲,ios,uipageviewcontroller,Ios,Uipageviewcontroller,我看到UIPageViewController使用Scroll转换与PageCurl之间的行为有所不同。PageCurl的工作方式与我预期的相同,但在使用滚动时,我有时会看到对ViewControllerBeforReviewController:和viewControllerAfterViewController: 有人知道这种额外数据源调用的模式吗 我正在显示一系列图像,我可以从序列中的任何位置开始。 当使用滚动转换(而不是PageCurl)时,如果我移动到“右侧”,则在显示初始页面后,我会
UIPageViewController
使用Scroll
转换与PageCurl
之间的行为有所不同。PageCurl的工作方式与我预期的相同,但在使用滚动时,我有时会看到对ViewControllerBeforReviewController:
和viewControllerAfterViewController:
有人知道这种额外数据源调用的模式吗
我正在显示一系列图像,我可以从序列中的任何位置开始。
当使用滚动转换(而不是PageCurl)时,如果我移动到“右侧”,则在显示初始页面后,我会收到3个数据源调用,而不是我预期的单个调用。对于下面的示例,我从索引值3开始。当我滑动移动到“下一个”图像时,我希望得到一个viewControllerAfterViewController:
调用索引3以访问索引4。如果我运行一个测试,我会得到两个额外的调用:一个用于索引3之前(即2),一个用于索引4之后(即5)。输出为:
2013-04-19 12:37:33.964 Clouds[496:907] Page 3 - viewControllerAfterViewController called on this index
2013-04-19 12:37:33.988 Clouds[496:907] Page 3 - viewControllerBeforeViewController called on this index
2013-04-19 12:37:34.010 Clouds[496:907] willTransitionToViewControllers to indices
2013-04-19 12:37:34.014 Clouds[496:907] Page 4
2013-04-19 12:37:34.461 Clouds[496:907] Page 4 - viewControllerAfterViewController called on this index
- (void)viewDidLoad
{
[super viewDidLoad];
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageViewController.delegate = self;
self.pageViewController.dataSource = self;
CloudImageVC *startingViewController = [self viewControllerAtIndex:self.currentPage storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
CGRect pageViewRect = self.view.bounds;
self.pageViewController.view.frame = pageViewRect;
[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;
}
- (CloudImageVC *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard {
// Return the data view controller for the given index.
if (index >= [self.imageNames count]) {
return nil;
}
self.dataViewController = [self makeDataViewControllerAtIndex:index storyboard:storyboard];
return self.dataViewController;
}
- (CloudImageVC *) makeDataViewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard {
// Make and return the data view controller for the given index.
if (index >= [self.imageNames count]) {
return nil;
}
// Create a new view controller and pass suitable data.
self.dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"CloudImageVC"];
self.dataViewController.imageIndex = index;
//self.dataViewController.cloudImage = nil;
return self.dataViewController;
}
- (NSUInteger)indexOfViewController:(CloudImageVC *)viewController
{
// Return the index of the given data view controller.
// For simplicity, we store the index value in the view controller.
return viewController.imageIndex;
}
#pragma mark - Page View Controller Data Source
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController];
NSLog(@"Page %d - viewControllerBeforeViewController called on this index", index);
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController];
NSLog(@"Page %d - viewControllerAfterViewController called on this index", index);
if (index == NSNotFound) {
return nil;
}
index++;
if (index == self.imageNames.count) {
return nil;
}
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
#pragma mark - Protocol UI PageViewController Delegate
- (void) pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers {
NSLog(@"willTransitionToViewControllers to indices");
for (CloudImageVC *vc in pendingViewControllers) {
NSLog(@"Page %d",vc.imageIndex);
}
}
所有这些之后显示的视图实际上是索引4的视图。在第一次转换之后,UIPageViewController的行为似乎与我预期的一样。当我使用PageCurl转换时,它总是按照我期望的方式运行,并且我没有收到任何这些无关的调用
实际生成输出的代码是:
2013-04-19 12:37:33.964 Clouds[496:907] Page 3 - viewControllerAfterViewController called on this index
2013-04-19 12:37:33.988 Clouds[496:907] Page 3 - viewControllerBeforeViewController called on this index
2013-04-19 12:37:34.010 Clouds[496:907] willTransitionToViewControllers to indices
2013-04-19 12:37:34.014 Clouds[496:907] Page 4
2013-04-19 12:37:34.461 Clouds[496:907] Page 4 - viewControllerAfterViewController called on this index
- (void)viewDidLoad
{
[super viewDidLoad];
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageViewController.delegate = self;
self.pageViewController.dataSource = self;
CloudImageVC *startingViewController = [self viewControllerAtIndex:self.currentPage storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
CGRect pageViewRect = self.view.bounds;
self.pageViewController.view.frame = pageViewRect;
[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;
}
- (CloudImageVC *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard {
// Return the data view controller for the given index.
if (index >= [self.imageNames count]) {
return nil;
}
self.dataViewController = [self makeDataViewControllerAtIndex:index storyboard:storyboard];
return self.dataViewController;
}
- (CloudImageVC *) makeDataViewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard {
// Make and return the data view controller for the given index.
if (index >= [self.imageNames count]) {
return nil;
}
// Create a new view controller and pass suitable data.
self.dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"CloudImageVC"];
self.dataViewController.imageIndex = index;
//self.dataViewController.cloudImage = nil;
return self.dataViewController;
}
- (NSUInteger)indexOfViewController:(CloudImageVC *)viewController
{
// Return the index of the given data view controller.
// For simplicity, we store the index value in the view controller.
return viewController.imageIndex;
}
#pragma mark - Page View Controller Data Source
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController];
NSLog(@"Page %d - viewControllerBeforeViewController called on this index", index);
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController];
NSLog(@"Page %d - viewControllerAfterViewController called on this index", index);
if (index == NSNotFound) {
return nil;
}
index++;
if (index == self.imageNames.count) {
return nil;
}
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
#pragma mark - Protocol UI PageViewController Delegate
- (void) pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers {
NSLog(@"willTransitionToViewControllers to indices");
for (CloudImageVC *vc in pendingViewControllers) {
NSLog(@"Page %d",vc.imageIndex);
}
}
答案在rdelmar的评论中。是的,我看到过这种模式,这并不是无稽之谈。当页面视图控制器设置为滚动转换时,将在视图层次结构中插入一个滚动视图,额外的调用用于获取上一个和下一个控制器,以便在部分滚动时,您可以同时看到下一个(或上一个)控制器和当前控制器。非常感谢您提供的信息。很高兴知道我没有虫子@rdelmar,但在我的例子中,它不叫“之前”,只叫“下一个”两次。你知道为什么吗?