IOS - блок завершения в UIView animateWithDuration вызывается слишком рано
Я пытаюсь сделать анимацию, когда ячейка просмотра таблицы будет выбрана. По какой-то причине блок завершения получает вызов слишком рано. Даже устанавливая продолжительность до 10 секунд, блок завершения сразу вызывается.
[UIView animateWithDuration:10.0 animations:^{
message.frame = newFrame;
} completion:^(BOOL finished) {
NSLog(@"DONE???");
}];
Любые мысли о том, почему это происходит? Спасибо.
Ответы
Ответ 1
Из документации UIView:
Завершение
Объект блока, который должен быть выполнен, когда последовательность анимации завершается. Этот блок не имеет возвращаемого значения и принимает один логический аргумент, который указывает, действительно ли анимация была закончена до того, как был вызван обработчик завершения. Если продолжительность анимации равна 0, этот блок выполняется в начале следующего цикла цикла запуска. Этот параметр может быть NULL.
Это означает, что нет гарантии, что код будет выполнен только тогда, когда анимация будет выполнена. Я бы посоветовал вам проверить "законченный" параметр как условие для выполнения.
Ответ 2
Да. Его называют слишком рано, потому что он каким-то образом прерван. Возможно, с помощью модального перехода или, возможно, что-то еще. В зависимости от ваших потребностей, вам может понадобиться следующее решение. Мы избегаем конфликта, вручную задерживая выполнение нашего кода анимации следующим образом:
// To get this in Xcode very easily start typing, "dispatch_aft..."
// Note the "0.2". This ensures the outstanding animation gets completed before we start ours
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:1.0 delay:0 options:0 animations:^{
// Your animation code
} completion:^(BOOL finished) {
// Your completion code
}];
});
Ответ 3
Также возможно, чтобы пополнение было вызвано раньше, если анимация не действует, например. установив альфа представления в значение, которое оно уже имеет.