Что именно делает параметр bool в animateWithDuration:animations:completion:


Я сослался на DOC и он сказал:

завершение
... Этот блок не имеет возвращаемого значения и принимает один логический аргумент, который указывает, действительно ли анимация была завершена до вызова обработчика завершения. ...

но я считаю, что независимо от того, используете ли вы параметр bool или нет,completion: блок всегда будет выполняться после animations: заблокировать. Так же, как два простых блока на основе фрагменты кода анимации, показанные ниже, оба из них делают то же самое.

[UIView animateWithDuration:0.3f
                  delay:0.0f
                options:UIViewAnimationCurveEaseInOut
             animations:^{
                 [myView setAlpha:0.0f];
             }
             completion:^(BOOL finished) {
                 [myView removeFromSuperview];
             }];

и

[UIView animateWithDuration:0.3f
                  delay:0.0f
                options:UIViewAnimationCurveEaseInOut
             animations:^{
                 [myView setAlpha:0.0f];
             }
             completion:^(BOOL finished) {
                 if (finished) [myView removeFromSuperview];
             }];

и я считаю, что большинство людей(включая меня) используют первый(даже официальный пример документа apple). Итак,

  • что это finished параметр, используемый здесь точно?
  • или какая ситуация будет использована?
1 56

1 ответ:

параметр finished будет отсутствовать, когда анимация была отменена: обычно, когда вы прервали анимацию, чтобы начать другую (например, вы начали новую анимацию, прежде чем текущая закончилась, с параметром, чтобы начать с текущего состояния) или вы непосредственно отменили анимацию.

фактически это отменяет текущую анимацию, но блок завершения все еще вызывается. Если бы вы связывали последовательность анимаций, вы бы этого хотели цепь, чтобы остановить, так что вы бы только продолжить цепочку предыдущей анимации закончилась.

в качестве примера, представьте, что у вас была игра, где бомба летела по экрану. Если пользователь не нажимает на бомбу, она взрывается, когда достигает края. Таким образом, у вас будет одна анимация для перемещения бомбы, а у вашего блока завершения будет другая анимация, чтобы показать взрыв, и, возможно, вызов какого-то метода, чтобы уменьшить счет или что-то еще.

Если пользователь нажимает на бомбу, вы бы отменили движущуюся анимацию и заставили бомбу улететь без вреда для себя. Ваш исходный блок завершения все равно будет выполнен, поэтому вам нужно будет знать, закончилась ли анимация сама по себе или была отменена.