ios - tutorial - ¿Cómo puedo saber si UIPageViewController dio la vuelta o se invirtió?
uipageviewcontroller swift 4 (6)
Tengo un UIPageViewController y simplemente no puedo descubrir cómo saber en qué dirección el usuario dio vuelta a la página para que pueda establecer el recuento de páginas de manera adecuada.
Gracias shani
Como dijo Hejazi
Después de que una transición guiada por gestos completa este method delegado se llama:
pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted:
La parte que se debe aclarar es que se completed
con YES
si la página se dio vuelta por completo y NO
si la página en realidad no se volvió. El caso de NO
ocurre, por ejemplo, cuando el usuario simplemente levanta la esquina de la página y luego la vuelve a colocar sin voltear la página.
Este es el concepto que querrá implementar:
- (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];
}
Después de que una transición guiada por gestos completa este method delegado se llama:
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
Entonces, al comparar el parámetro previousViewControllers
y pageViewController.viewControllers
puede conocer la dirección.
Grandes respuestas para el manejo del controlador de página. Descubrí que el controlador de vista que se agregó como una página llamará a viewWillAppear cuando el usuario deslice la página a la vista y también llamará a viewDidAppear cuando se complete.
La plantilla ''Aplicación basada en página'' proporciona estos 2 métodos:
- (NSUInteger)indexOfViewController:(DataViewController *)viewController;
un método para encontrar el índice dado un controlador de vista
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index
un método para crear una instancia de un controlador de vista dado un índice.
Para realizar la animación correcta, necesita conocer el índice de su controlador de vista actual. Los métodos de plantillas basadas en páginas son perfectos para eso. Luego, simplemente compare su índice ''saltar a'' y su índice ''actual''.
Aquí hay un código para obtener la idea:
- (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];
}
Podría agregar una propiedad "pageIndex" a sus controladores de vista que sirven como páginas. IOW, cuando cree los controladores de vista para viewControllerBeforeViewController & viewControllerAfterViewController (o cuando llame a setViewControllers), almacene un pageIndex en los controladores de vista a los que puede hacer referencia cuando necesite conocer el índice.
Cuando el usuario gire una página, se setViewControllers:
método setViewControllers de setViewControllers:
. Este método recibe un argumento de tipo UIPageViewControllerNavigationDirection
que le dará la información que necesita.