2013-04-19 11 views
5

Vedo un comportamento diverso tra uno UIPageViewController utilizzando le transizioni Scroll rispetto a PageCurl. PageCurl funziona come mi aspetto, ma quando utilizzo Scroll -ing a volte vedo chiamate extra (senza senso) a viewControllerBeforeViewController: e viewControllerAfterViewController: Qualcuno riconosce questo modello di chiamate di Data Source aggiuntive?Comportamento UIPageViewController diverso per Scroll & PageCurl

Sto visualizzando una serie di immagini e posso iniziare in qualsiasi punto della sequenza. Quando si utilizza la transizione Scroll, ma non PageCurl, dopo che viene visualizzata la pagina iniziale se si passa a "destra", ricevo 3 chiamate DataSource invece del singolo che mi aspetto. Per l'esempio seguente ho iniziato al valore dell'indice 3. Quando passo il dito per passare all'immagine "successiva", mi aspetto di ottenere una singola chiamata viewControllerAfterViewController: all'indice 3 per arrivare all'indice 4. Se eseguo un test ottengo due chiamate extra: una per Prima indice 3 (cioè 2) e una per Dopo indice 4 (cioè 5). L'output è:

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 

Il punto di vista che viene visualizzato dopo tutto questo è davvero la vista per l'indice 4. Dopo questo primo passaggio l'UIPageViewController sembra comportarsi il modo in cui mi aspetto. Quando uso la transizione PageCurl si comporta sempre come mi aspetto e non ottengo nessuna di queste chiamate estranee.

Il codice che in realtà ha prodotto l'output è:

- (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

Sì, ho visto questo modello e non è privo di senso. Quando un controller di visualizzazione di pagina è impostato sulla transizione di scorrimento, nella gerarchia di visualizzazione viene inserita una vista di scorrimento e le chiamate extra consentono di ottenere i controller precedenti e successivi, in modo tale che quando si scorre parzialmente, è possibile visualizzare il successivo (o precedente) uno allo stesso tempo di quello attuale. – rdelmar

+0

Grazie mille per le informazioni. È bello sapere che non ho un bug! –

+0

@rdelmar Ma nel mio caso non chiama il "prima" ma solo il "prossimo" due volte. Hai qualche idea sul perché? –

risposta

0

La risposta è nel commento di rdelmar.

Problemi correlati