2012-01-05 3 views

ответ

0

Когда пользователь поворачивает страницу метод в UIPageViewController в setViewControllers: будет называться. Этот метод получает аргумент типа UIPageViewControllerNavigationDirection, который предоставит вам необходимую информацию.

+15

По крайней мере, на iOS 6, '-setViewControllers: direction: animated: completion:' не вызывается, если переход был инициирован жестом. Я просто попробовал. – jrc

3

шаблон «Application страницу на основе» The обеспечивают эти 2 метода:

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

способ нахождения индекса дали контроллер представления

- (DataViewController *)viewControllerAtIndex:(NSUInteger)index 

метод экземпляра контроллер представления заданного индекса ,

Для правильной анимации вам необходимо знать индекс вашего текущего контроллера. Методы шаблонов на основе страниц идеально подходят для этого. Затем вы просто сравниваете свой индекс «перейти к» и ваш «текущий» индекс.

Вот код, чтобы получить идею:

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

Я говорю о ситуации, когда анимация запускается на основе распознавателей жестов. – shannoga

+0

Установили ли вы источник данных для просмотра pageviewcontroller? Существует два метода, которые вы должны реализовать: '- pageViewController: viewControllerBeforeViewController:' вызывается, когда страница перевернута назад, '- pageViewController: viewControllerAfterViewController:' вызывается, когда страница перевернута вперед. Это то, что вы пытаетесь найти? Я не понимаю ваш вопрос полностью, возможно, вам следует более подробно объяснить вашу проблему. –

+0

Я использую эти методы. Дело в том, что мне нужно обновить переменную, содержащую номер страницы. У меня есть массив объектов, которые мне нужно назначить видимому контроллеру, и мне нужно знать, что такое номер страницы, чтобы я мог получить правильный объект. Для этого мне нужно знать, вернулся ли пользователь назад или вперед, чтобы я мог правильно обновить номер страницы. – shannoga

7

После перехода жест приводом завершает этот делегат method называется:

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: 

Таким образом, сравнивая параметр previousViewControllers и pageViewController.viewControllers вы можете знать направление.

+0

привет Hejazi, я сравниваю два массива с if ([previousViewControllers isEqualToArray: pvc.viewControllers]), и я всегда получаю false (когда я поворачиваю страницу вправо или влево), я делаю что-то неправильно? – Grace

+0

'previousViewControllers' всегда содержит один элемент, он не может использоваться для различения направлений. – lambdas

+0

@ lambdas Пока вы знаете номер страницы, связанный с данным контроллером, вы можете определить направление, проверив предыдущие контроллеры (ы) и контроллеры текущего вида. – Hejazi

32

Как Hejazi сказал

После перехода жест приводом завершает этот делегат method называется:

pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted:

часть, которая должна быть уточняется, что completed будет YES, если страница была полностью повернута и будет NO, если страница фактически не перевернулась. Случай NO случается, например, когда пользователь просто поднимает угол страницы и затем отбрасывает его, не перелистывая страницу.

Это понятие вы хотите реализовать:

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

Также обратите внимание, что страница, возможно, не изменилась, даже если событие завершено. Пользователь может частично перевернуть страницу, но недостаточно далеко, чтобы изменить страницу, затем анимация вернет их на страницу, на которой они уже были. – diadyne

+1

@ diadyne здесь задействованы два BOOL - «закончено» будет true, если событие закончено, но, как сказал chrisofflive, «завершено» будет указывать, завершил ли пользователь завершение страницы. – todd412

+0

Этот ответ приближает меня к решению. С вашим ответом в сочетании с которым 'index' является следующим, что он * будет * переход для решения проблемы. См. Этот [ответ] (http://stackoverflow.com/a/27576378/571227) также о том, как узнать следующий индекс, на который он будет переходить. – haxpor

2

Вы можете добавить свойство «pageIndex» в контроллерах зрения, которые служат в качестве страниц. IOW, когда вы создаете контроллеры представления для viewControllerBeforeViewController & viewControllerAfterViewController (или когда вы вызываете setViewControllers), храните pageIndex в этих контроллерах представления, которые затем можно ссылаться, когда вам нужно знать индекс.

1

отличные ответы на вопросы для управления страничным контроллером. Я обнаружил, что контроллер вида, который был добавлен в качестве страницы, вызовет viewWillAppear, когда пользователь переместит страницу в поле зрения, а также после этого вызовет viewDidAppear.

Смежные вопросы