Как сделать анимацию UIView на основе блоков опциональной?

В моем пользовательском элементе управления есть метод -setValue:animated:, который принимает флаг animated.

До iOS 4 я бы написал анимацию следующим образом:

if (animated) {
    [UIView beginAnimations:@"Foo"];
    [UIView setAnimationDuration:5.0];
}
// ... layout views ...
if (animated) {
    [UIView commitAnimations];
}

Теперь я написал это:

[UIView animateWithDuration:(animated ? 5.0 : 0.0) animations:^{
    // ... layout views ...
}];

НО: это приводит к тому, что некоторые элементы не анимируются!

Я вызываю этот метод более одного раза (первый раз без, второй раз с анимацией), поэтому во второй раз анимация отменяется, устанавливая мой новый кадр «жестким» (без анимации).

Как реализовать необязательную анимацию с помощью блочного подхода?


person Yang Meyer    schedule 14.04.2011    source источник


Ответы (1)


Вы можете определить все изменения, которые хотите внести в блок. Затем вы либо передаете блок UIView animate..., если хотите, чтобы изменения были анимированными, либо выполняете его напрямую, чтобы внести изменения без анимации.

void (^myViewChanges)(void) = ^() {
    myView.alpha = 0.5;
    // other changes you want to make to animatable properties
};

if (animated) {
    [UIView animateWithDuration:5.0f animations:myViewChanges];
} else {
    myViewChanges();
}
person odrm    schedule 14.04.2011
comment
Хорошо... но почему бы Apple просто не сделать это за вас, когда вы передаете длительность анимации 0? (Я знаю... наверное, здесь никто не сможет ответить на этот вопрос. Просто выговариваю.) - person Greg Maletic; 15.10.2013
comment
@GregMaletic вроде. Но поскольку система обрабатывает запуск блока анимации, это не всегда может давать желаемые результаты. Я только что столкнулся со случаем, когда вызов animateWithDuration:animations:completion: вызывал блок завершения слишком поздно. Сохранение блока завершения и вызов его в предложении else (как указано выше) исправили это для меня. - person Dylan Hand; 14.04.2016