Ответ 1
Да, поскольку длительность равна нулю, переход будет эффективно мгновенно.
Мне нужно обработать случай, когда вы можете сделать что-то с анимацией или без нее, а не:
if (animation)
{
[UIView animateWithBlock:^(){...}];
}
else
{
...
}
Я хочу сделать:
[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]
но не уверен, что он работает, даже если это так, есть ли какие-либо накладные расходы для использования этого вместо прямого изменения вида?
Спасибо
Да, поскольку длительность равна нулю, переход будет эффективно мгновенно.
Что я делаю в этом случае, это создать блок, содержащий все анимации, которые я хочу сделать. Затем выполните анимацию UIView, передающую блок анимации в качестве параметра или непосредственно вызывающий этот блок, хочу ли я, чтобы он был анимированным или нет. Что-то вроде этого:
void (^animationBlock)();
animationBlock=^{
// Your animation code goes here
};
if (animated) {
[UIView animateWithDuration:0.3 animations:animationBlock completion:^(BOOL finished) {
}];
}else{
animationBlock();
}
Это позволит избежать накладных расходов
В соответствии с документами Apple:
Если продолжительность анимации равна 0, этот блок выполняется в начале следующего цикла цикла цикла.
Хорошо, у меня есть дополнительные наблюдения по этому поводу. Во-первых, накладные расходы на производительность при использовании анимации с нулевой продолжительностью, но более глубокая разница заключается в том, что блок завершения анимации обрабатывается async. Это означает, что первое скрытие, а затем отображение вида может не дать вам ожидаемого результата.
Итак, нет, я бы определенно предложил не использовать нуль в качестве продолжительности, поскольку он не является синхронным.
Я написал это небольшое расширение 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.
вы можете установить значение 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];**
Пожалуйста, дайте мне знать, если возникли проблемы.