Animar self.view.frame?
-
25-10-2019 - |
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!
Solución
Considere dónde están las vistas justo antes de que comiencen las animaciones:
self.view.frame
es (supongo) 0,0,320,380myViewController.view
es una subvisión deself.view
myViewController.view.frame
es 320,0,320,480 enself.view
Sistema 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,480myViewController.view
sigue siendo una subvisión deself.view
myViewController.view.frame
es 0,0,320,480 enself.view
Sistema 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.