2013-04-19 12 views
5

widzę różne zachowanie między UIPageViewController użyciu Scroll przejścia kontra PageCurl. PageCurl działa w sposób, jakiego oczekuję, ale korzystając z przewijania, czasami widzę dodatkowe (bezsensowne) połączenia z viewControllerBeforeViewController: i viewControllerAfterViewController: Czy ktoś rozpoznaje ten wzorzec dodatkowych wywołań danych?UIPageViewController zachowanie różny dla Scroll & PageCurl

Wyświetlam serię obrazów i mogę rozpocząć od dowolnego miejsca w sekwencji. Podczas korzystania z przejścia przewijania, ale nie od strony PageCurl, po wyświetleniu strony początkowej po przejściu do "prawej" otrzymuję 3 wywołania DataSource zamiast jednego, którego oczekuję. W poniższym przykładzie zacząłem od wartości indeksu równej 3. Po przesunięciu, aby przejść do "następnego" obrazu, oczekuję pojedynczego wywołania viewControllerAfterViewController: na indeksie 3, aby uzyskać indeks 4. Jeśli wykonam test, otrzymam dwa dodatkowe połączenia: jedna dla Przed indeksem 3 (tj. 2) i jedna dla Po indeksie 4 (tj. 5). Wyjście jest:

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 

Widok, który jest wyświetlany po tym wszystkim jest rzeczywiście widok na indeksie 4. Po tym pierwszym przejściowym UIPageViewController wydaje się zachowywać tak, jak oczekujesz. Kiedy używam przejścia PageCurl, zawsze zachowuje się tak, jak się spodziewam i nie dostaję żadnego z tych nieistotnych połączeń.

Kod, który rzeczywiście wyprodukował wyjścia:

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

Tak, widziałem ten wzór i nie jest to bezsensowne. Gdy kontroler widoku strony jest ustawiony na przejście między przewijaniem, widok przewijania jest wstawiany do hierarchii widoków, a dodatkowe wywołania służą do pobierania poprzednich i następnych kontrolerów, aby po częściowym przewinięciu można było zobaczyć następny (lub poprzedni) jeden w tym samym czasie, co obecny. – rdelmar

+0

Dziękuję bardzo za informacje. Miło jest wiedzieć, że nie mam błędu! –

+0

@rdelmar Ale w moim przypadku nie nazywa się "przed", ale tylko "następny" dwa razy. Czy masz pojęcie, dlaczego? –

Odpowiedz

0

Odpowiedź jest w komentarzu przez rdelmar.