Что именно делает параметр bool в animateWithDuration: animations: complete: - PullRequest
65 голосов
/ 31 декабря 2011

Я сослался на 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 Ответ

94 голосов
/ 31 декабря 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...