Что именно делает параметр bool в animateWithDuration: анимация: завершение:

Я упомянул 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

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

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

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

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