В чем разница между isRemovedOnCompletion и kCAFillModeForwards - PullRequest
0 голосов
/ 21 октября 2018

Я не совсем понимаю, в чем разница между isRemovedOnCompletion и kCAFillModeForwards в анимации слоев.Я читаю книгу об анимации, в которой предлагается использовать только kCAFillModeForwards для отображения последнего кадра.

Но со мной это не сработало, поэтому я выполнил поиск, и я вижу других, предлагающих объединить kCAFillModeForwards и isRemovedOnCompletion, чтобы сохранить последнийрамка представлена.Последнее решение работало со мной, но я все еще растерялся, в чем разница между ними?

1 Ответ

0 голосов
/ 21 октября 2018

Вы не должны неправильно использовать 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 означает, что анимация никогда не заканчивается!Это ужасная идея;это создает ненужную нагрузку на движок рендеринга, и это совершенно неверно и ненужно.По сути, вы перекрываете реальную позицию вида / слоя с позицией анимации.Это неправильно .Никогда не следуй этим примерам.Научитесь правильно писать анимацию и делайте это.

...