の遷移とPageCurl
の間で異なる動作が発生しています。Scroll
の遷移を使用しています。 PageCurlは私が期待した通りに動作しますが、スクロールを使用すると時々viewControllerBeforeViewController:
とviewControllerAfterViewController:
への余分な(無意識の)呼び出しが発生します 誰かが追加のデータソース呼び出しのこのパターンを認識していますか?UIPageViewControllerの動作がScroll&PageCurlとは異なります
私は一連の画像を表示しており、シーケンス内のどこからでも起動できます。 PageCurlではなくScrollトランジションを使用する場合、最初のページが表示された後、私が「右」に移動すると、私は期待した単一のデータソースではなく3つのDataSource呼び出しを取得します。以下の例では、インデックス値3から始めました。「次の」画像にスワイプして、viewControllerAfterViewController:
インデックス3を呼び出すと、インデックス4になります。テストを実行すると、余分なコール:1つ前のインデックス3(つまり2)と1つ後のインデックス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
すべてこの後に表示されるビューは確かにUIPageViewControllerは、私が期待するように動作するように思われる。この最初の遷移の後のインデックス4の図です。 PageCurlトランジションを使用すると、常に期待どおりの動作をしますが、これらの無関係なコールは発生しません。
実際に出力を生成するコードは次のとおりです。
- (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);
}
}
はい、私はこのパターンを見ましたが、それは無意味ではありません。ページビューコントローラは、スクロールトランジションに設定されている場合は、スクロールビューは、ビュー階層に挿入され、あなたが部分的にスクロールされたとき、あなたは次の(またはを見ることができるように余分な呼び出しは、前回と次のコントローラを得るためにあります前の)1つを現在のものと同時に表示します。 – rdelmar
情報ありがとうございました。私にはバグがないことを知ってうれしいです! –
@rdelmarしかし、私の場合、「前」を呼び出すのではなく、「次の」だけを2回呼び出す。あなたはその理由を知っていますか? –