Вы не должны неправильно использовать isRemovedOnCompletion
или kCAFillModeForwards
для этой цели.Я видел эту книгу, и многие примеры используют этот «трюк», но это неправильно.Это один из худших дезинформационных мемов, когда-либо распространявшихся в Интернете!Это просто опора, чтобы восполнить тот факт, что вы неправильно создали анимацию.
Например, рассмотрим следующий простой код:
let opts : UIView.AnimationOptions = .autoreverse
let xorig = self.v.center.x
UIView.animate(withDuration:1, delay: 0, options: opts, animations: {
self.v.center.x += 100
}, completion: nil
)
Вид анимирует 100 точек вправо изатем анимирует 100 пунктов обратно в исходное положение - и затем переходит 100 пунктов назад вправо .Причина в том, что последнее фактическое значение, которое мы присвоили центру вида x
, составляет 100 точек вправо, поэтому, когда анимация заканчивается и «анимационный фильм» удаляется, вид раскрывается, все еще сидя на 100 пунктоввправо.
Решение состоит в том, чтобы самостоятельно переместить вид в исходное положение!Вы можете сделать это в функции completion:
:
let opts : UIView.AnimationOptions = .autoreverse
let xorig = self.v.center.x
UIView.animate(withDuration:1, delay: 0, options: opts, animations: {
self.v.center.x += 100
}, completion: { _ in
self.v.center.x = xorig
})
Все злоупотребления kCAFillModeForwards
и isRemovedOnCompletion
основаны на неспособности сделать что-то подобное.При просмотре анимации или явной анимации слоя программист не стал придавать анимированному свойству значение, которое оно будет иметь в конце анимации.Так что запутанный программист тогда обманывает, подметая проблему под ковер.kCAFillModeForwards
означает «сохранить анимацию в своей конечной точке, когда она заканчивается».Установка isRemovedOnCompletion
в false
означает, что анимация никогда не заканчивается!Это ужасная идея;это создает ненужную нагрузку на движок рендеринга, и это совершенно неверно и ненужно.По сути, вы перекрываете реальную позицию вида / слоя с позицией анимации.Это неправильно .Никогда не следуй этим примерам.Научитесь правильно писать анимацию и делайте это.