Подтвердить что ты не робот

IOS - блок завершения в UIView animateWithDuration вызывается слишком рано

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

[UIView animateWithDuration:10.0 animations:^{
    message.frame = newFrame;
} completion:^(BOOL finished) {
    NSLog(@"DONE???");
}];

Любые мысли о том, почему это происходит? Спасибо.

4b9b3361

Ответ 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

Также возможно, чтобы пополнение было вызвано раньше, если анимация не действует, например. установив альфа представления в значение, которое оно уже имеет.