2013-04-19 11 views
5

の遷移と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); 
    } 
} 
+3

はい、私はこのパターンを見ましたが、それは無意味ではありません。ページビューコントローラは、スクロールトランジションに設定されている場合は、スクロールビューは、ビュー階層に挿入され、あなたが部分的にスクロールされたとき、あなたは次の(またはを見ることができるように余分な呼び出しは、前回と次のコントローラを得るためにあります前の)1つを現在のものと同時に表示します。 – rdelmar

+0

情報ありがとうございました。私にはバグがないことを知ってうれしいです! –

+0

@rdelmarしかし、私の場合、「前」を呼び出すのではなく、「次の」だけを2回呼び出す。あなたはその理由を知っていますか? –

答えて

0

答えがrdelmarによるコメントです。

関連する問題