2012-01-04 13 views
6

Creé una aplicación con guión gráfico, con un controlador de vista inicial, conectado a muchos controles de vista posteriores, conectados secuencialmente, usando segue de transición cruzada. Estos funcionan uno golpe. Todo funciona bien Sin embargo, en lugar de tener que usar los segues básicos, quiero tener un segue personalizado que deslice el contenido del controlador de vista dentro y fuera de la pantalla, al igual que el impulso para los controles de navegación, pero, al estar habilitado para ir a la izquierda y a la derecha dependiendo de si uno avanza o retrocede en la aplicación.Cómo codificar una transición personalizada que "se desliza" entre View Controllers?

He establecido el segue a personalizado, y he creado y guardado un archivo MySegue.h. SIN EMBARGO, no sé cómo codificar un segue personalizado que deslice un controlador de visualización fuera de la pantalla mientras el otro se desliza hacia adelante y hacia atrás mientras me muevo entre los controladores de vista.

¿Alguien puede proporcionarme la codificación (debe ser fácil) de una transición personalizada para pasar de un controlador de vista a la siguiente y viceversa deslizando la pantalla para que no tenga que usar el ¿Disolución cruzada básica o volcados estándar ofrecidos en Xcode 4.2? Estaría muy agradecido.

Respuesta

0

¿Por qué no usar simplemente un UINavigationController? Esto parece ser exactamente para lo que están diseñados.

+0

Porque solo se deslizan de derecha a izquierda, no de izquierda a derecha, ya que se desliza entre "páginas", que es lo que configuré para que mis controles de visualización funcionen. Además, tengo un gráfico para una barra de encabezado y no quiero las barras del controlador de navegación estándar. Puedo estar hablando totalmente fuera de la escuela y realmente no entiendo UINavigationController. ¿Puedo deslizar hacia adelante y hacia atrás deslizando el contenido en la pantalla en ambas direcciones? – user1130050

+0

UINaviagtionController es probablemente lo que quieres. Y en iOS 5 puedes personalizar completamente la barra de navegación en la parte superior. O establezca la propiedad naviationBarHidden y ponga sus propios controles personalizados en la pantalla. – agilityvision

+0

Gracias.¿Necesito una codificación especial para hacer que "retroceda" cuando retrocede en secuencia entre los controladores de visualización? – user1130050

4

Me encontré con el mismo problema aquí, pero estaba usando gestos deslizar para pasar de un controlador de vista a otro. Usar el guión gráfico en sí para configurar los guiones funcionaba bien, pero cuando necesité un deslizamiento para "volver" al controlador de vista anterior, la animación pasó de derecha a izquierda, en lugar de izquierda a derecha. Para solucionar ese problema, hice lo siguiente:

  1. Integrado un controlador de navegación en el controlador de vista raíz.
  2. Usa segues para empujar los nuevos controladores de visualización.
  3. Cuando quería "volver" al controlador de vista anterior, no añadí un segue al guión gráfico para presionar el controlador de vista anterior. En cambio, llamé al método popViewControllerAnimated del Controlador de navegación cada vez que se producía un deslizamiento hacia atrás.
+0

Se siente como la mejor y más suave solución. – fr00tyl00p

2

Para crear un segue personalizado que deslice los controladores de vista primero cree una clase que extienda UIStoryboardSegue, luego anule el selector de rendimiento. Acabo de hacer algo como esto y debería funcionar para ti también. Aquí está mi código:

#define kAnimationDuration 0.5 

#import "CustomSlideSegue.h" 

@implementation CustomSlideSegue 

- (void)perform 
{ 
    UIViewController *sourceViewController = (UIViewController *) self.sourceViewController; 
    UIViewController *destinationViewController = (UIViewController *) self.destinationViewController; 

    [sourceViewController.view addSubview:destinationViewController.view]; 
    [destinationViewController.view setFrame:sourceViewController.view.window.frame]; 

    [destinationViewController.view setBounds:sourceViewController.view.bounds]; 
    CGSize screenSize = [[UIScreen mainScreen] bounds].size; 

    if (!self.slideLeft) { 
     [UIView animateWithDuration:kAnimationDuration 
           delay:0.0 
          options:UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
          [destinationViewController.view setCenter:CGPointMake(screenSize.height + screenSize.height/2, screenSize.height/2 - 138)]; 
          [destinationViewController.view setCenter:CGPointMake(screenSize.width/2 + 127, screenSize.height/2 - 138)]; 
         } 
         completion:^(BOOL finished){ 
          [destinationViewController.view removeFromSuperview]; 
          [sourceViewController presentViewController:destinationViewController animated:NO completion:nil]; 
         }]; 
    } else { 
     [UIView animateWithDuration:kAnimationDuration 
           delay:0.0 
          options:UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
          [destinationViewController.view setCenter:CGPointMake(-1*screenSize.height/2, screenSize.height/2 - 138)]; 
          [destinationViewController.view setCenter:CGPointMake(screenSize.width/2 + 127, screenSize.height/2 - 138)]; 
         } 
         completion:^(BOOL finished){ 
          [destinationViewController.view removeFromSuperview]; 
          [sourceViewController presentViewController:destinationViewController animated:NO completion:nil]; 
         }]; 
    } 
} 

Luego, cuando se desea realizar la segue utilizar este código:

UIViewController *destination = [self.storyboard instantiateViewControllerWithIdentifier:@"some identifier"]; 
    CustomZoomSegue *segue = [[CustomZoomSegue alloc] initWithIdentifier:@"segue vc identifier" source:self destination:destination]; 
    [self prepareForSegue:segue sender:self]; 
    [segue perform]; 

Las llamadas CGPointMake son por encargo a mi código (que utiliza la orientación horizontal) pero debe ser capaz de cámbielo para que se ajuste a sus necesidades. Si necesita más aclaraciones o tiene alguna pregunta, hágamelo saber e intentaré responder.

NOTA: Utilizo guiones gráficos sin líneas de transición entre los controladores de vista.

+0

Esto funcionó muy bien para mí usando una técnica similar. No había pensado agregar la vista de destino a la fuente. Gran idea. –

Cuestiones relacionadas