La reproducción automática interrumpe la animation UIView

Luchando por hacer que mi aplicación funcione tanto con el iPhone 5 como con los iPhone más pequeños. Estaré encantado de requerir iOS6 y usar Autolayout porque funciona muy bien.

Sin embargo, la aplicación tiene 4 botones que intercambian posiciones regularmente, así que asigno cada button una location diferente de una matriz y luego animo el movimiento con algo como esto:

[UIView animateWithDuration:0.5 animations:^{ button1.center = [[locations objectAtIndex:0] CGPointValue]; button2.center = [[locations objectAtIndex:1] CGPointValue]; button3.center = [[locations objectAtIndex:2] CGPointValue]; button4.center = [[locations objectAtIndex:3] CGPointValue]; }]; 

Esto no funciona con Autolayout. Nada cambia. Lo mejor que he conseguido es que se animará a una position y luego se recuperará inmediatamente.

Cuando elimino Autolayout, sin embargo, todos los botones están arrugados en los iPhones más pequeños y porque estoy usando los puntos establecidos por el tamaño del iPhone 5, terminan más abajo, dejando la fila inferior fuera de la pantalla. Yo original tenía diferentes numbers CGPoint que obtuve de Interface Builder, pero estaban "equivocados", aunque estoy pensando que estaban "equivocados" porque eran los numbers para que Autolayout los usara. La matriz solo para que puedas ver:

 buttonLocations = [NSArray arrayWithObjects: [NSValue valueWithCGPoint:CGPointMake(57, 523)], [NSValue valueWithCGPoint:CGPointMake(109, 523)], [NSValue valueWithCGPoint:CGPointMake(57, 471)], [NSValue valueWithCGPoint:CGPointMake(109, 471)], nil]; 

¿Qué debo hacer para solucionar este problema? Establecer puntos diferentes para cada dispositivo de tamaño no parece ser muy eficiente.

La solución es que anime la propiedad de transformación de elementos, no su position.

La position se establecerá mediante autolayout y no quieres combatirlo. La position real en la pantalla, sin embargo, va a ser su position "correcta" (establecida por layout automático), compensada por su propiedad de transformación.

Entonces puedes decir button.transform = CGTransformMake (x, y) y aparecerá x y y fuera de su position central.

Hay una variedad de CGWs cualesquiera macros para hacer estas transformaciones fácilmente, y puedes simplemente cambiarlas en un bloque de animation para mover los elementos alnetworkingedor.

Una forma sería utilizar el sistema de layout automático y animar el valor "constante" de la restricción. En el siguiente código de ejemplo, tengo tres botones en una fila horizontal, cada uno con una restricción de borde anterior a la supervisión, que es lo que yo animo. side1, side2 y side3 son IBOutlets a esas restricciones, y button1, button2 y button3 son las salidas de los 3 botones.

 -(void)animateButton { [self.view removeConstraint:self.side1]; [self.view removeConstraint:self.side2]; [self.view removeConstraint:self.side3]; NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.button1 attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:114]; NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:213]; NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:self.button3 attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:20]; [self.view addConstraints:@[con1,con2,con3]]; [UIView animateWithDuration:2 animations:^{ [self.view layoutIfNeeded]; }]; } 

Puede solucionar este problema con muy pocos cambios en su código. En lugar de cambiar las ubicaciones de los botones, cambie sus restricciones de layout. Puede usar el cocoapod SBP para cambiar las restricciones de layout importando esta categoría

  #import "UIViewController+SBP.h" 

Luego usando este método

  - (void)switchViewConst:(UIView*)firstView secondView:(UIView*)secondView durationInSeconds:(double)durationInSeconds 

Aquí hay un video tutorial .