У меня есть UIStackView с вертикальной осью, которая отображает некоторые элементы, похожие на UITableView. Однако я анимирую их в режиме Delay с помощью DispatchQueue.main.asyncAfter.
Вот код, который я использую для создания CABasicAnimation:
let anim = CABasicAnimation(keyPath: "transform.translation.x")
anim.duration = 0.2
anim.fromValue = UIScreen.main.bounds.size.width
anim.toValue = 0
anim.isRemovedOnCompletion = true
anim.fillMode = kCAFillModeRemoved
По какой-то причине, по крайней мере, в Симуляторе (я не думаю, что это имеет значение, так как это приложение должно работать на старых устройствах или мощных устройствах, таких как iPhone 7+), анимация не всегда приземляется на одно и то же место.
Иногда ячейка прилетает и находится примерно в 8 пикселях слева, иногда в 12, иногда в 20. Это кажется непостоянным. Но я думаю, что мое toValue равно 0, оно должно появиться там, где оно обычно появляется, если бы я не добавлял анимацию к слою.
Я попытался установить для isRemovedOnCompletion значение true, а для fillMode удалить, но это, похоже, не исправило анимацию.
Кстати, по мере продолжения анимации есть один момент, когда ячейка создается из горизонтального UIStackView, где в ней скрыты аранжированные подвиды. Я использую метод UIView.animateWithDuration, чтобы установить для их скрытых значений значение false и, таким образом, анимировать подпредставления.
Причина, по которой я это замечаю, заключается в том, что, когда это происходит, ячейки вверху возвращаются на свои места, а не на несколько пикселей.
Я попробовал setNeedsDisplay для ячеек после их анимации, а также для вертикального стека, но это тоже не сработало. Я не понимаю, что происходит и почему эти слои просто не анимируются в правильном положении. Любые идеи?
P.S. Весь вертикальный stackView инициализируется в методе инициализации ViewController. Анимации происходят в методе viewDidAppear. Я попытался компенсировать анимацию, добавив DispatchQueue.main.asyncAfter, а также первым делом после super.viewDidAppear(animated), но оба результата были одинаковыми.