CALayer: отображение, анимация и конечное состояние
CALayer управляет визуальным содержимым, геометрией и анимацией в Core Animation. UIView обычно имеет связанный слой, а отдельный CALayer можно добавить как sublayer. Утверждение, что слой не имеет представления на экране, неверно: именно слой участвует в отображении, хотя не заменяет обработку событий UIView.
Создание
let box = CALayer()
box.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
box.backgroundColor = UIColor.red.cgColor
view.layer.addSublayer(box)Явная анимация цвета
let target = UIColor.blue.cgColor
let animation = CABasicAnimation(keyPath: "backgroundColor")
animation.fromValue = box.presentation()?.backgroundColor
?? box.backgroundColor
animation.toValue = target
animation.duration = 1.0
CATransaction.begin()
CATransaction.setDisableActions(true)
box.backgroundColor = target
CATransaction.commit()
box.add(animation, forKey: "color")Явная анимация показывает промежуточное состояние, но сама не сохраняет новое значение свойства model layer. Поэтому конечный цвет записывается отдельно. Иначе после завершения анимации возможен возврат к старому значению; fillMode не должен подменять правильное состояние модели.
Размер и преобразование
Тот же принцип относится к bounds/position. Для поворота можно задать CATransform3DMakeRotation с нужной осью; frame при transform уже не следует использовать как простую независимую геометрию. При изменении layout обновляйте положение слоя согласованно с контейнером.
Проверьте начало, середину и конец анимации, повторный запуск до завершения и настройку Reduce Motion. Слои не предоставляют готовую семантику доступности для новой интерактивной кнопки: для неё нужен подходящий UI-элемент.