2013-04-19 3 views
5

PageCurlScroll 전환을 사용하여 UIPageViewController 사이의 다른 동작이 나타납니다. PageCurl은 예상대로 작동하지만 스크롤을 사용하면 viewControllerBeforeViewController:viewControllerAfterViewController:에 대한 추가 (무의미한) 호출이 표시됩니다. 이 추가 데이터 소스 호출 패턴을 인식하는 사람이 있습니까?UIPageViewController의 동작이 Scroll & PageCurl과 다릅니다

일련의 이미지가 표시되며 시퀀스의 어느 위치에서나 시작할 수 있습니다. PageCurl이 아닌 스크롤 전환을 사용할 때 "오른쪽"으로 이동하면 초기 페이지가 표시된 후 원하는 단일 데이터 대신 3 개의 DataSource 호출을 얻습니다. 아래의 예제에서 나는 3의 인덱스 값에서 시작했다. "다음"이미지로 이동하기 위해 슬쩍했을 때 하나의 인덱스를 얻으려는 viewControllerAfterViewController: 인덱스 3을 호출한다. 테스트를 실행하면 2를 얻는다. 추가 호출 : 인덱스 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 

이 모든 후 표시되는 뷰는 실제로 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

예, 저는이 패턴을 보았으며 무의미하지 않습니다. 페이지 뷰 컨트롤러가 스크롤 전환으로 설정되면 스크롤보기가 뷰 계층 구조에 삽입되고 추가 호출은 이전 및 다음 컨트롤러를 가져 오는 것이므로 부분적으로 스크롤하면 다음 (또는 이전) 하나를 현재 것과 동시에. – rdelmar

+0

정보를 제공해 주셔서 대단히 감사합니다. 내가 버그가 없다는 것을 아는 것이 좋다! –

+0

@rdelmar 그러나 내 경우에는 "이전"을 호출하지 않고 "다음"만 두 번 호출합니다. 왜 그 이유에 대해 알고 있습니까? –

답변

0

대답은 rdelmar에 의해 코멘트입니다.

관련 문제