Нужно ли тестировать BOOL, завершенную в обработчике завершения для анимации UIView?

Я никогда не думал о возвращенном BOOL finished обработчике завершения анимации UIView, но чтение некоторого примера кода в Руководстве по программированию Apple UIView показывает это:

completion:^(BOOL finished) {
 if (finished) {

Это необходимо? Блок завершения не должен запускаться, пока анимация не закончится в любом случае, не так ли? Тест кажется излишним.

Ответы

Ответ 1

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

[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView)
    toView:(displayingPrimary ? secondaryView : primaryView)
    duration:1.0
    options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :
                UIViewAnimationOptionTransitionFlipFromLeft)
    completion:^(BOOL finished) {
        if (finished) {
            displayingPrimary = !displayingPrimary;
        }
}];

В этом случае, если анимация (по какой-либо причине) не завершена, то точки зрения не обмениваются, и вы абсолютно не хотите переворачивать значение displayingPrimary, потому что тогда вы иметь неточную запись вашего статуса. Вот почему флаг finished отмечен в этом случае.

Обратите внимание, что в большинстве (если не все) других образцов кода в этом руководстве флаг не проверяется - это потому, что он не является значительным в этих случаях (запуск другой анимации после первого, например, или изменение некоторых значение, которое не зависит от успешного завершения анимации).

Ответ 2

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

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