UIDynamics y Autolayout

Recientemente utilicé UIDynamics para animar una vista de image en su lugar. Sin embargo, debido a que su restricción auto-out y-pos se configuró como fuera de la pantalla, al navegar fuera de la pantalla y luego volver a ella, mi vista de la image se colocaba fuera de la pantalla nuevamente. La animation demoró aproximadamente 3 segundos, así que después de tres segundos acabo de restablecer la restricción. Eso se siente un poco hacky.

Entonces mi pregunta es esta: ¿cuál es la forma correcta de manejar la reproducción automática y UIDynamics al mismo time?

Este no es realmente un problema dynamic. La reproducción automática es incompatible con cualquier animation de vista, o con cualquier configuration manual del marco: cuando aparece el layout, son las restricciones las que se obedecerán. Depende de usted, si mueve una vista manualmente de alguna forma, para actualizar las restricciones para que coincida con su nueva position / tamaño / lo que sea.

Dicho esto: con UIKit Dynamics, cuando finaliza la animation, el animador hará una pausa y se notificará al delegado del animador:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIDynamicAnimatorDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIDynamicAnimatorDelegate/dynamicAnimatorDidPause :

Entonces ese es el momento para actualizar las restricciones.

Tienes una buena solución proporcionada por Geppy Parziale en este tutorial .

Básicamente, puede crear un object que se ajuste a UIDynamicItem:

 @interface DynamicHub : NSObject <UIDynamicItem> @property(nonatomic, readonly) CGRect bounds; @property(nonatomic, readwrite) CGPoint center; @property(nonatomic, readwrite) CGAffineTransform transform; @end 

Eso necesita iniciar los límites o se bloqueará:

 - (id)init { self = [super init]; if (self) { _bounds = CGRectMake(0, 0, 100, 100); } return self; } 

Y luego usa UIDynamics en ese object y usa los valores intermedios para actualizar sus restricciones:

 DynamicHub *dynamicHub = [[DynamicHub alloc] init]; UISnapBehavior *snapBehavior = [[UISnapBehavior alloc] initWithItem:dynamicHub snapToPoint:CGPointMake(50.0, 150.0)]; [snapBehavior setDamping:.1]; snapBehavior.action = ^{ self.firstConstraint.constant = [dynamicHub center].y; self.secondConstraint.constant = [dynamicHub center].x; }; [self.animator addBehavior:snapBehavior];