Вопрос по objective-c, uiview, iphone – Нужно ли проверять завершенную BOOL в обработчике завершения анимации UIView?

15

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

<code>completion:^(BOOL finished) {
 if (finished) {
</code>

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

Ваш Ответ

2   ответа
3

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

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

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

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

[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 флаг установлен в этом случае.

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

Согласно документу transitionFromView добавьте toView в НАЧАЛЕ анимации и получите fromView из superView в КОНЦЕ анимации. Означает ли это, что готово ложно, чем ОБА из fromView и toView все еще там? Потому что в моих случаях я видел случаи, когда оба исчезли.
таким образом, кажется, что блок завершения может фактически выполняться, даже если завершенное bool равно нулю. почему это случилось? так как это "завершение" блок, не будет ли он работать, только если предыдущий блок действительно завершен? johnbakers
Начиная новую анимацию с помощью одного из этих методов, существует возможность прерывания новой анимации первым. Также имеется возможность разрешить взаимодействие пользователя с представлением, что может предоставить возможность отменить анимацию.

Похожие вопросы