2013-04-19 30 views
5

Tôi thấy hành vi khác nhau giữa một UIPageViewController sử dụng chuyển đổi Scroll so với PageCurl. PageCurl hoạt động theo cách tôi mong đợi nhưng khi sử dụng Scroll-ing, đôi khi tôi thấy các cuộc gọi thêm (vô nghĩa) tới viewControllerBeforeViewController:viewControllerAfterViewController: Có ai nhận ra mẫu gọi nguồn dữ liệu bổ sung này không?Hành vi UIPageViewController khác với Scroll & PageCurl

Tôi đang hiển thị một loạt hình ảnh và tôi có thể bắt đầu từ bất kỳ đâu trong chuỗi. Khi sử dụng quá trình chuyển đổi Cuộn, nhưng không phải PageCurl, sau khi trang đầu tiên được hiển thị nếu tôi chuyển sang "đúng", tôi nhận được 3 cuộc gọi DataSource thay vì cuộc gọi duy nhất mà tôi mong đợi. Ví dụ chạy bên dưới, tôi bắt đầu với giá trị chỉ mục của mình là 3. Khi tôi vuốt để di chuyển đến hình ảnh "tiếp theo", tôi dự kiến ​​sẽ nhận được một lệnh gọi viewControllerAfterViewController: trên chỉ mục 3 để đến chỉ mục 4. Nếu tôi chạy thử nghiệm, tôi nhận được hai cuộc gọi thêm: một cho trước chỉ số 3 (tức là 2) và một cho chỉ số sau 4 (tức là 5). Đầu ra là:

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 

Quan điểm cho rằng sẽ được hiển thị sau khi tất cả điều này thực sự là quan điểm cho chỉ số 4. Sau lần chuyển đổi đầu tiên này UIPageViewController dường như cư xử theo cách tôi mong đợi. Khi tôi sử dụng quá trình chuyển đổi PageCurl, nó luôn hoạt động theo cách tôi mong đợi và tôi không nhận được bất kỳ cuộc gọi không liên quan nào.

Mã mà thực sự được sản xuất đầu ra là:

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

Vâng, tôi đã thấy mẫu này và không phải vô nghĩa. Khi bộ điều khiển xem trang được đặt ở chế độ cuộn, chế độ xem cuộn được chèn vào phân cấp khung nhìn và các cuộc gọi bổ sung sẽ nhận các bộ điều khiển trước đó và tiếp theo, để khi bạn được cuộn một phần, bạn có thể xem tiếp theo (hoặc trước đó) cùng một lúc với phiên bản hiện tại. – rdelmar

+0

Cảm ơn rất nhiều thông tin. Nó là tốt đẹp để biết rằng tôi không có một lỗi! –

+0

@rdelmar Nhưng trong trường hợp của tôi nó không gọi là "trước" nhưng chỉ "tiếp theo" hai lần. Bạn có bất kỳ ý tưởng về lý do tại sao? –

Trả lời

0

Câu trả lời là trong các bình luận của rdelmar.

Các vấn đề liên quan