ios8 - requiere - error de animación iOS 8
youtube ipa v11 19.07 iphone 4 (4)
Este ejemplo podría ayudarte, ojalá lo hubiera descubierto antes de perder horas. En lugar de animar el frame
, anima sus contraints
. Haga clic en la restricción de diseño automático que desea ajustar (en el constructor de interfaces, por ejemplo, la restricción superior). A continuación, haga esto un IBOutlet;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;
Animar hacia arriba;
self.topConstraint.constant = -100;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
Animate de vuelta al lugar original.
self.topConstraint.constant = 0;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
Publicado originalmente por mí here
Así que ajustarías la restricción para self.view.frame
en tu ejemplo.
Tengo un método simple para animar la vista.
-(void)animateSelf
{
CABasicAnimation * animation;
animation = [CABasicAnimation animationWithKeyPath:@"position.y"];
// settings ...
[self.view.layer addAnimation:animation forKey:@"position.y"];
animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
// settings ...
[self.view.layer addAnimation:animation forKey:@"transform.rotation.z"];
[UIView animateWithDuration: 1.0 animations:^{
CGRect rect = self.view.frame;
rect.origin.y += 800;
self.view.frame = rect;
} completion:nil];
}
Para iOS 7 funcionó bien. Pero para iOS 8 la animación se comporta de forma impredecible. ¿Hay alguna manera de combinar estas animaciones para iOS 8?
Intenté reemplazar animateWithDuration: por otro CABasicAnimation, pero no sirvió de nada. Los registros de view.frame son correctos, pero la animación de view.frame salta de un origen oscuro.
Después de eliminar CABasicAnimation para position.y
(el primero) el error desaparece.
Lo que funcionó para mí fue deshabilitar las salidas automáticas en la vista y LAS SUBVISTAS de la vista que estaba animando en algún momento antes de hacer la animación. Deshabilitar las reproducciones automáticas del guión gráfico no fue suficiente en iOS8.
[viewToAnimate removeFromSuperview];
[viewToAnimate setTranslatesAutoresizingMaskIntoConstraints:YES];
//addSubview again at original index
[superView insertSubview:viewToAnimate atIndex:index];
También tuve un problema de pequeñas diferencias desagradables entre iOS7 y iOS8 animación. En la mayoría de los casos se rompió fue:
- combinación única de escalar, transformar y rotar CGAffineTransforms: el resultado dependía de la versión de iOS
- o una secuencia compleja de animaciones en diferentes vistas: algunas vistas "restablecían" sus posiciones antes de comenzar una nueva pieza de animaciones. Cerca del 5% de las piezas de animación fueron afectadas.
Estoy bastante seguro de que no hubo animaciones simultáneas en las vistas problemáticas. Las sugerencias de autolayout y las restricciones no ayudaron (además, todas las vistas animadas se crearon en el código, ya que el autolayout interfirió mucho con la animación incluso antes de iOS8).
Lo que resultó ser una solución universal para ambos problemas es colocar las vistas problemáticas en una vista de envoltura y usarla para dividir la animación de Rotación o para hacer la animación que causa el efecto de "reinicio". Ahora funciona igual en 7.1.1 y 8.1.1.
Tienes tres animaciones:
- Animas la
position
la capa. - Animas la
transform
la capa. - Usted anima el
frame
la vista que a su vez anima laposition
la capa.
Las animaciones 1 y 3 chocan.
- En iOS 7 el comportamiento es que la animación 3 cancela la animación 1.
- En iOS 8, el comportamiento es que las animaciones 1 y 3 se ejecutan simultáneamente ("Animaciones aditivas").
Le sugiero que simplemente elimine la animación 1 y también vea el video relacionado de la WWDC 2014 (creo que se trata de Building Interruptible and Responsive Interactions
).