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

Блок анимации UIView: если продолжительность равна 0, то такая же, как без анимации?

Мне нужно обработать случай, когда вы можете сделать что-то с анимацией или без нее, а не:

if (animation)
{
    [UIView animateWithBlock:^(){...}];
}
else
{
    ...
}

Я хочу сделать:

[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]

но не уверен, что он работает, даже если это так, есть ли какие-либо накладные расходы для использования этого вместо прямого изменения вида?

Спасибо

4b9b3361

Ответ 1

Да, поскольку длительность равна нулю, переход будет эффективно мгновенно.

Ответ 2

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

void (^animationBlock)();
animationBlock=^{
      // Your animation code goes here
};
if (animated) {
    [UIView animateWithDuration:0.3 animations:animationBlock completion:^(BOOL finished) {

    }];
}else{
    animationBlock();
}

Это позволит избежать накладных расходов

Ответ 3

В соответствии с документами Apple:

Если продолжительность анимации равна 0, этот блок выполняется в начале следующего цикла цикла цикла.

Ответ 4

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

Итак, нет, я бы определенно предложил не использовать нуль в качестве продолжительности, поскольку он не является синхронным.

Ответ 5

Я написал это небольшое расширение Swift для решения проблемы:

extension UIView {

/// Does the same as animate(withDuration:animations:completion:), yet is snappier for duration 0
class func animateSnappily(withDuration duration: TimeInterval, animations: @escaping () -> Swift.Void, completion: (() -> Swift.Void)? = nil) {
    if duration == 0 {
        animations()
        completion?()
    }
    else {
        UIView.animate(withDuration: duration, animations: animations, completion: { _ in completion?() })
    }
}
}

Можно использовать его в качестве замены для UIView.animate(withDuration:animations:completion) и не нужно больше думать о длительности 0.

Ответ 6

вы можете установить значение animateWithDuration динамически в соответствии с требованиями.

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

    **float animationDurationValue=0.03f;
        [UIView animateWithDuration:x delay:0.0f options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse 
animations:^{
                             [yourView setFrame:CGRectMake(0.0f, 100.0f, 300.0f, 200.0f)];
                         }
                         completion:nil];**

Пожалуйста, дайте мне знать, если возникли проблемы.