2012-01-05 19 views

Respuesta

0

Cuando el usuario enciende una página método de la UIPageViewController setViewControllers: se llamará. Este método recibe un argumento del tipo UIPageViewControllerNavigationDirection que le proporcionará la información que necesita.

+15

Al menos en iOS 6, '-setViewControllers: direction: animated: completion:' no se llama si la transición se inició con un gesto. Lo intenté. – jrc

3

plantilla 'Página-Based aplicación' proporcionan estos 2 métodos:

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

un método para encontrar índice dado un controlador de vista

- (DataViewController *)viewControllerAtIndex:(NSUInteger)index 

un método para crear instancias 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 plantilla basados ​​en página son perfectos para eso. Luego, simplemente compare su índice de '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]; 
} 
+0

Me refiero a una situación en la que la animación se desencadena por los reconocedores de gestos nativos. – shannoga

+0

¿Ha configurado la fuente de datos de su pageviewcontroller? Hay dos métodos que debe implementar, '- pageViewController: viewControllerBeforeViewController:' llamado cuando la página se invierte hacia atrás, '- pageViewController: viewControllerAfterViewController:' llamado cuando la página se da vuelta hacia adelante. ¿Es esto lo que estás tratando de encontrar? No entiendo tu pregunta a fondo, tal vez deberías explicar tu problema con más detalle. –

+0

Estoy usando esos métodos. Lo que pasa es que necesito actualizar una variable que contenga el número de página. Tengo una matriz de objetos que debo asignar al controlador visible y necesito saber cuál es el número de página para poder obtener el objeto correcto. Para hacer eso, necesito saber si el usuario volvió atrás o hacia adelante para poder actualizar el número de página correctamente. – shannoga

7

Después de una transición gesto impulsado completa este delegado method se llama:

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: 

Así, comparando el parámetro previousViewControllers y pageViewController.viewControllers se puede saber la dirección.

+0

hola Hejazi, estoy comparando las dos matrices con if ([previousViewControllers isEqualToArray: pvc.viewControllers]) y siempre obtengo false (cuando giro la página hacia la derecha o hacia la izquierda), ¿estoy haciendo algo mal? – Grace

+0

'previousViewControllers' siempre contiene un solo elemento, no se puede usar para distinguir entre direcciones. – lambdas

+0

@lambdas Siempre que sepa el número de página asociado con un controlador de vista determinado, puede averiguar la dirección comprobando los controladores de vista anteriores y los controladores de vista actuales. – Hejazi

32

Como Hejazi dijo

Después de una transición gesto impulsado completa este delegado method se llama:

pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted:

La parte que debe estar se aclaró que completed será YES si la página se convirtió por completo y será NO si la página no giró realmente. El caso 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 se desea 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]; 
} 
+0

También tenga en cuenta que la página puede no haber cambiado incluso si el evento ha finalizado. El usuario puede girar una página parcialmente pero no lo suficiente para cambiar la página, luego la animación los llevará de vuelta a la página en la que ya estaban. – diadyne

+1

@diadyne hay dos BOOL involucradas aquí: 'finished' será verdadero si el evento finalizó, pero como dijo chrisofflive, 'completed' indicará si el usuario completó o no el turno de la página. – todd412

+0

Esta respuesta me acerca más a la solución. Con su respuesta se combina con qué 'índice' es el siguiente en el que * hará * transición para resolver el problema. Vea también esta [respuesta] (http://stackoverflow.com/a/27576378/571227) sobre cómo conocer el siguiente índice al que hará la transición. – haxpor

2

Se podría añadir una propiedad "pageIndex" a sus controladores de vista que sirven como las páginas. IOW, cuando crea los controladores de vista para viewControllerBeforeViewController & viewControllerAfterViewController (o cuando llama a setViewControllers), almacene un pageIndex en esos controladores de vista que luego puede consultar siempre que necesite conocer el índice.

1

excelentes respuestas para el manejo del controlador de página. Descubrí que el controlador de visualización que se agregó como página llamará a viewWillAppear a medida que el usuario desliza la página hacia la vista y también llamará a viewDidAppear al finalizar.

Cuestiones relacionadas