animation - animat - ¿Se manejan las diferencias de animación de AutoLayout en iOS 10?
ui animation swift 3 (3)
En el siguiente método:
[super viewDidLoad];
Escribe esta línea:
[self.view layoutIfNeeded];
Me he dado cuenta de que en iOS 10 Beta 5 (a punto de probar Beta 6), la animación de restricción de AutoLayout se comporta de forma un poco diferente.
Por ejemplo, este enfoque no funciona igual que en versiones anteriores de iOS:
[view addConstraints:@[constraints...]];
[view setNeedsUpdateConstraints];
[view layoutIfNeeded];
[UIView animateWithDuration:...
{
/* adjust constraint here... */
[view layoutIfNeeded]; // Only the adjusted constraints since previous layoutIfNeeded() call should animate change with duration.
} completion:{ ... }];
... En mis pruebas, las restricciones agregadas inicialmente con addConstraints()
también se addConstraints()
en iOS 10 con el bloque animateWithDuration()
... lo que está causando un comportamiento funky / indeseable hasta el momento.
Por ejemplo, establecer las restricciones izquierda / derecha en la matriz (pero las restricciones verticales en el bloque) hace que toda la vista se anime en la pantalla en diagonal con este enfoque ... que es totalmente incorrecto.
¿Alguien sabe cómo hacerlo correctamente tanto para iOS 9 (y abajo), como para 10?
Hice una pequeña prueba cambiando H y V de una pequeña vista roja:
self.red_POS_H = NSLayoutConstraint.constraints(withVisualFormat: "H:|-90-[redView]", options: defaultOptions, metrics: nil, views: viewsDictionary)
self.red_POS_V = NSLayoutConstraint.constraints(withVisualFormat: "V:|-30-[redView]", options: defaultOptions, metrics: nil, views: viewsDictionary)
self.view.addConstraints(self.red_POS_V!)
self.view.addConstraints(self.red_POS_H!)
y lo animó:
// we hope is only one:
let currV = self.red_POS_V![0]
let currH = self.red_POS_H![0]
UIView.animate(withDuration: 3) {
// Make all constraint changes here
currV.constant = 100
currH.constant = 300
self.view.layoutIfNeeded() // Forces the layout of the subtree animation block and then captures all of the frame changes
}
la vista roja se movió correctamente, si comenta una sola línea en la animación, funciona, horizontal o verticalmente.
Pequeño proyecto disponible, si lo necesita.
Intenta llamar a layoutIfNeeded
en la vista layoutIfNeeded
de la vista, en lugar de la vista en sí misma.
-
Tuve un problema similar, se suponía que mi vista se animaba desde la parte superior a una altura de 0, hacia abajo a una altura> 0 (es decir, (0, 0, 320, 0) a (0, 0, 320, 44)).
Usando Xcode 8 con iOS 10, el comportamiento de la animación fue muy diferente. En lugar de animar hacia abajo desde la parte superior, la vista se anima hacia arriba y hacia abajo desde el centro vertical del cuadro de destino.
Lo arreglé por, en lugar de llamar a layoutIfNeeded
en la vista misma, llamándolo en la vista superior de la vista. De alguna manera, el comportamiento fue restaurado.
¡Espero eso ayude!
Comentario útil por @Ramiro:De acuerdo con la documentación,
layoutIfNeeded
establece las subvistas (pero no contempla la vista actual en sí). Por lo tanto, para actualizar la disposición actual de la vista, debe llamar alayoutIfNeeded
desde lalayoutIfNeeded
.