Pregunta

Estoy tratando de imitar el Controller de ViewController de UINAVIGITIVO usando la animación UIView, pero parece que he encontrado con un problema. No puedo animar el self.view.frame.

Este es el código que estoy usando pero Self.view simplemente no se moverá!

    [self.view addSubview:myViewController.view];
    [myViewController.view setFrame:CGRectMake(320, 0, 320, 480)];    
    [UIView animateWithDuration:0.5 
                     animations:^{
                         [self.view setFrame:CGRectMake(-320, 0, 320, 480)];
                         [myViewController.view setFrame:CGRectMake(0, 0, 320, 480)];
                     }
                     completion:^(BOOL finished){
                         [view1.view removeFromSuperview];
                     }];

¡Gracias!

¿Fue útil?

Solución

Considere dónde están las vistas justo antes de que comiencen las animaciones:

  • self.view.frame es (supongo) 0,0,320,380
  • myViewController.view es una subvisión de self.view
  • myViewController.view.frame es 320,0,320,480 en self.viewSistema de coordenadas, por lo que está fuera del marco de su supervisión (y fuera del borde derecho de la pantalla)

Ahora considere dónde están las vistas después de que terminen las animaciones:

  • self.view.frame es -320,0,320,480
  • myViewController.view sigue siendo una subvisión de self.view
  • myViewController.view.frame es 0,0,320,480 en self.viewSistema de coordenadas, por lo que está completamente dentro del marco de su supervisión, pero su marco en las coordenadas de pantalla es -320,0,320,480, por lo que ahora está completamente fuera del borde izquierdo de la pantalla

Necesitas hacer myViewController.view un hermano de self.view, no una subvisión. Prueba esto:

// Calculate the initial frame of myViewController.view to be
// the same size as self.view, but off the right edge of self.view.
// I don't like hardcoding coordinates...
CGRect frame = self.view.frame;
frame.origin.x = CGRectGetMaxX(frame);
myViewController.view.frame = frame;
[self.view.superview addSubview:myViewController.view];
// Now slide the views over.
[UIView animationWithDuration:0.5 animations:^{
    CGRect frame = self.view.frame;
    myViewController.view.frame = frame;
    frame.origin.x -= frame.size.width;
    self.view.frame = frame;
} completion:^(BOOL done){
    [view1.view removeFromSuperview];
}];

Otros consejos

No puedo decir si tiene otros problemas relacionados con el contexto de dónde se llama a este código. Parece view1 es una subclase UIViewController. Deberías cambiar el nombre de eso, bastante confuso.

Noté un problema con las manipulaciones de su marco. Parece que self es un controlador de vista de contenedor, por ejemplo self.view contiene las vistas que se animan (view1.view y myViewController.view y no debería ser animado en sí mismo. Si eso es correcto, su animación debería ser:

[self.view addSubview:myViewController.view];
[myViewController.view setFrame:CGRectMake(320, 0, 320, 480)];    
[UIView animateWithDuration:0.5 
                 animations:^{
                     [view1.view setFrame:CGRectMake(-320, 0, 320, 480)];
                     [myViewController.view setFrame:CGRectMake(0, 0, 320, 480)];
                 }
                 completion:^(BOOL finished){
                     [view1.view removeFromSuperview];
                 }];

Como aparte, parece extraño que un controlador de vista se anime de su supervisión. Si self es un controlador de vista de contenedor que esperaría que la lógica esté allí. Ver mi respuesta a ¿Animar los controladores de cambio de vista sin usar la pila de controlador de navegación, subvistas o controladores modales? Para un ejemplo de cómo implementar un controlador de vista de contenedor. Es trivial modificar mi ejemplo allí para hacer la diapositiva en la animación que desea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top