2012-01-05 33 views

Trả lời

0

Khi người dùng quay một trang phương pháp setViewControllers: của UIPageViewController sẽ được gọi. Phương thức này nhận được một đối số kiểu UIPageViewControllerNavigationDirection sẽ cung cấp cho bạn thông tin bạn cần.

+15

Ít nhất là trên iOS 6, '-setViewControllers: direction: animated: completion:' không được gọi nếu chuyển đổi được bắt đầu bằng cử chỉ. Tôi vừa thử nó. – jrc

3

Các 'Trang-Based Application' mẫu cung cấp những 2 phương pháp:

- (NSUInteger)indexOfViewController:(DataViewController *)viewController; 

một phương pháp cho việc tìm kiếm index cho một bộ điều khiển xem

- (DataViewController *)viewControllerAtIndex:(NSUInteger)index 

một phương pháp cho instantiating một bộ điều khiển xem đưa ra một chỉ số .

Để tạo hoạt ảnh chính xác, bạn cần biết chỉ mục của bộ điều khiển chế độ xem hiện tại của mình. Các phương thức mẫu dựa trên trang hoàn toàn phù hợp với điều đó. Sau đó, bạn chỉ cần so sánh chỉ mục 'nhảy tới' của bạn và chỉ mục 'hiện tại' của bạn.

Dưới đây là một số mã để có được những ý tưởng:

- (void)jumpToPage:(NSInteger)page {  
    // find current index 
    DataViewController *currentViewController = (DataViewController *)[self.pageViewController.viewControllers lastObject]; 
    NSUInteger index = [self indexOfViewController:currentViewController]; 

    // choosing the correct direction 
    // if the 'current' is smaller than the 'jump to' page, then choose forward 
    // vice versa 
    UIPageViewControllerNavigationDirection direction; 
    if (index < page) { 
     direction = UIPageViewControllerNavigationDirectionForward; 
    } else { 
     direction = UIPageViewControllerNavigationDirectionReverse; 
    } 

    // choose view controllers according to the orientation 
    NSArray *viewControllers; 
    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { 
     DataViewController *rightViewController = [self viewControllerAtIndex:page]; 
     viewControllers = [NSArray arrayWithObject:rightViewController]; 
    } else { 
     DataViewController *rightViewController = [self viewControllerAtIndex:page]; 
     DataViewController *leftViewController = [self viewControllerAtIndex:page-1]; 
     viewControllers = [NSArray arrayWithObjects:leftViewController, rightViewController, nil]; 
    } 

    // fire the method which actually trigger the animation 
    [self.pageViewController setViewControllers:viewControllers 
            direction:direction 
             animated:YES 
            completion:nil]; 
} 
+0

Tôi đang nói về một tình huống khi hoạt ảnh được kích hoạt bởi bộ nhận dạng cử chỉ gốc. – shannoga

+0

Bạn đã đặt nguồn dữ liệu của trình xem trang của bạn chưa? Có hai phương thức mà bạn nên thực hiện, '- pageViewController: viewControllerBeforeViewController:' được gọi khi trang bị đảo ngược, '- pageViewController: viewControllerAfterViewController:' được gọi khi trang được lật về phía trước. Đây có phải là những gì bạn đang cố gắng tìm? Tôi không hiểu rõ câu hỏi của bạn, có lẽ bạn nên giải thích chi tiết hơn về vấn đề của mình. –

+0

Tôi đang sử dụng các phương pháp đó. vấn đề là tôi cần phải cập nhật một biến chứa số trang. Tôi có một mảng các đối tượng mà tôi cần phải gán cho bộ điều khiển hiển thị và tôi cần phải biết số trang là gì để tôi có thể nhận được đối tượng chính xác. Để thực hiện điều đó, tôi cần phải biết liệu người dùng đã quay lại hay chuyển tiếp để tôi có thể cập nhật số trang chính xác. – shannoga

7

Sau một quá trình chuyển đổi cử chỉ điều khiển hoàn delegate này method được gọi là:

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: 

Vì vậy, bằng cách so sánh thông số previousViewControllerspageViewController.viewControllers bạn có thể biết hướng.

+0

hi Hejazi, tôi so sánh hai mảng với if ([previousViewControllers isEqualToArray: pvc.viewControllers]) và tôi luôn bị sai (khi tôi lật trang sang phải hoặc sang trái), tôi có làm gì sai không? – Grace

+0

'previousViewControllers' luôn chứa một mục duy nhất, nó không thể được sử dụng để phân biệt giữa các hướng. – lambdas

+0

@lambdas Miễn là bạn biết số trang được liên kết với một bộ điều khiển xem đã cho, bạn có thể tìm ra hướng bằng cách kiểm tra (các) bộ điều khiển xem trước đó và bộ điều khiển xem hiện tại. – Hejazi

32

Như Hejazi nói

Sau một quá trình chuyển đổi cử chỉ điều khiển hoàn delegate này method được gọi là:

pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted:

Phần rằng nên làm rõ là completed sẽ là YES nếu trang đã được chuyển hoàn toàn và sẽ là NO nếu trang không thực sự quay. Trường hợp NO xảy ra, ví dụ: khi người dùng chỉ kéo lên góc của trang và sau đó đặt nó xuống mà không cần lật trang.

Đây là khái niệm bạn sẽ muốn thực hiện:

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    // If the page did not turn 
    if (!completed) 
    { 
     // You do nothing because whatever page you thought 
     // the book was on before the gesture started is still the correct page 
     return; 
    } 

    // This is where you would know the page number changed and handle it appropriately 
    // [self sendPageChangeNotification:YES]; 
} 
+0

Cũng lưu ý rằng trang có thể không thực sự thay đổi ngay cả khi sự kiện kết thúc. Người dùng có thể biến một phần trang nhưng không đủ xa để thay đổi trang, sau đó hoạt ảnh sẽ đưa họ trở lại trang mà họ đã truy cập. – diadyne

+1

@diadyne có hai BOOL tham gia ở đây - 'hoàn thành' sẽ là đúng nếu sự kiện kết thúc nhưng như chrisofflive đã nói, 'hoàn thành' sẽ cho biết người dùng có hoàn thành lượt trang hay không. – todd412

+0

Câu trả lời này đưa tôi đến gần hơn với giải pháp. Với câu trả lời của bạn kết hợp với 'chỉ mục' nào tiếp theo, nó sẽ * chuyển tiếp để giải quyết vấn đề. Xem [answer] (http://stackoverflow.com/a/27576378/571227) về cách biết chỉ số tiếp theo nó sẽ chuyển sang. – haxpor

2

Bạn có thể thêm một "pageIndex" tài sản để điều khiển xem của bạn đóng vai trò như các trang. IOW, khi bạn tạo bộ điều khiển xem cho viewControllerBeforeViewController & viewControllerAfterViewController (hoặc khi bạn gọi setViewControllers), lưu một pageIndex trong các bộ điều khiển khung nhìn mà bạn có thể tham khảo bất cứ khi nào bạn cần biết chỉ mục.

1

các câu trả lời tuyệt vời để xử lý bộ điều khiển trang. Tôi thấy rằng trình điều khiển chế độ xem đã được thêm dưới dạng trang sẽ gọi viewWillAppear khi người dùng trượt trang vào chế độ xem và cũng sẽ gọi viewDidAppear khi hoàn thành.

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