animations - iOS: el bloque de finalización en UIView animateWithDuration se llama demasiado pronto
uiview animation swift 4 (3)
De la documentación de UIView :
terminación
Un objeto de bloque que se ejecutará cuando finalice la secuencia de animación. Este bloque no tiene valor de retorno y toma un solo argumento booleano que indica si las animaciones realmente terminaron antes de que se llamara al controlador de finalización. Si la duración de la animación es 0, este bloque se realiza al comienzo del siguiente ciclo de bucle de ejecución. Este parámetro puede ser NULL.
Lo que esto significa es que no hay una garantía de que el código se ejecutará solo cuando se realice la animación. Le recomiendo que verifique el parámetro "finalizado" como condición para la ejecución.
Estoy tratando de hacer alguna animación cuando se selecciona una celda de vista de tabla. Por alguna razón, el bloque de finalización se llama demasiado pronto. Incluso estableciendo la duración en 10 segundos, el bloque de finalización se llama inmediatamente.
[UIView animateWithDuration:10.0 animations:^{
message.frame = newFrame;
} completion:^(BOOL finished) {
NSLog(@"DONE???");
}];
¿Alguna idea sobre por qué esto está sucediendo? Gracias.
Sí. Se llama demasiado pronto porque se interrumpe de alguna manera. Probablemente por una transición de presentación modal o quizás algo más. Dependiendo de sus necesidades, la siguiente puede ser una solución que le guste. Evitamos el conflicto demorando manualmente la ejecución de nuestro código de animación de la siguiente manera:
// To get this in Xcode very easily start typing, "dispatch_aft..."
// Note the "0.2". This ensures the outstanding animation gets completed before we start ours
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:1.0 delay:0 options:0 animations:^{
// Your animation code
} completion:^(BOOL finished) {
// Your completion code
}];
});
También es posible que la finalización se llame antes si la animación no tiene ningún efecto, por ejemplo, establecer el alfa de una vista en el valor que ya tiene.