Uso de beginAnimations desanimado

Meronix me informó recientemente que se desaconseja el uso de beginAnimations . Al leer la reference de la class UIView , veo que esto es cierto, según la class de Apple ref:

El uso de este método no se recomienda en iOS 4.0 y versiones posteriores. Debería utilizar los methods de animation basados ​​en bloques para especificar sus animaciones.

Veo que una gran cantidad de otros methods, que utilizo con frecuencia, también están "desalentados", lo que significa que estarán alnetworkingedor para iOS 6 (con suerte), pero que probablemente se desaprobarán o eliminarán eventualmente.

¿Por qué se desalientan estos methods?

Como nota al margen, ahora estoy usando beginAnimations en todo tipo de aplicaciones, más comúnmente para mover la vista hacia arriba cuando se muestra un keyboard.

 //Pushes the view up if one of the table forms is selected for editing - (void) keyboardDidShow:(NSNotification *)aNotification { if ([isRaised boolValue] == NO) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount); [UIView commitAnimations]; isRaised = [NSNumber numberWithBool:YES]; } } 

No estoy seguro de cómo duplicar esta funcionalidad con methods basados ​​en bloques; un enlace tutorial sería bueno.

Se desaniman porque hay una alternativa mejor y más limpia.

En este caso, todo lo que hace una animation de bloques envuelve automáticamente sus cambios de animation ( setCenter: por ejemplo) en comenzar y confirmar llamadas para que no se olvide. También proporciona un bloque de finalización, lo que significa que no tiene que lidiar con los methods de delegado.

La documentation de Apple sobre esto es muy buena, pero como ejemplo, para hacer la misma animation en forma de bloque sería

 [UIView animateWithDuration:0.25 animations:^{ self.view.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount); } completion:^(BOOL finished){ }]; 

También ray wenderlich tiene una buena publicación sobre animaciones en bloques: link

Otra forma es pensar en una posible implementación de animaciones de bloque

 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations { [UIView beginAnimations]; [UIView setAnimationDuration:duration]; animations(); [UIView commitAnimations]; } 

Echa un vistazo a este método en UIView, lo que lo hace bastante simple. La parte más delicada hoy en día no es permitir que un bloque tenga un fuerte indicador de sí mismo:

 //Pushes the view up if one of the table forms is selected for editing - (void) keyboardDidShow:(NSNotification *)aNotification { if ([isRaised boolValue] == NO) { __block UIView *myView = self.view; [UIView animateWithDuration:0.25 animations:^(){ myView.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount); }]; isRaised = [NSNumber numberWithBool:YES]; } }