У меня есть CATextLayer внутри UIView.
Я анимирую рамку UIView для выращивания с
UIView.animate(withDuration: 3.0, delay: 0, options: .beginFromCurrentState, animations: anim, completion: nil)
Также я меняю фрейм для CATextLayer без анимации, потому что свойство фрейма не анимируемое.
Я анимирую границы CATextLayer и свойства fontSize следующим кодом:
let textBoundsAnim = CABasicAnimation(keyPath: "bounds")
textBoundsAnim.toValue = CGRect(x: 0, y: 0, width: self.contentView.frame.width - 70, height: textRect.height)
textBoundsAnim.fromValue = textLayer.bounds
textBoundsAnim.duration = 3.0
textBoundsAnim.fillMode = .forwards
textBoundsAnim.isRemovedOnCompletion = false
textBoundsAnim.delegate = self
textLayer.add(textBoundsAnim, forKey: "boundsChange")
let textFontAnim = CABasicAnimation(keyPath: "fontSize")
textFontAnim.fromValue = translatedTextLayer.fontSize
textFontAnim.toValue = 21
textFontAnim.duration = 5.0
textFontAnim.fillMode = .forwards
textFontAnim.isRemovedOnCompletion = false
textFontAnim.delegate = self
textLayer.add(textFontAnim, forKey: "fontSizeChange")
Конечное состояние анимации выглядит хорошо, но в процессе анимации текст выходит из поля зрения.
Я думаю, что размер текста рассчитывается на основе размера фрейма, и текст сразу выходит за рамки фрейма.
* +1012 *
Как анимировать увеличение текста одновременно с увеличением родительского представления
Обновление:
Я думаю, что проблема с текстовой анимацией возникает из-за того, что длина предложений рассчитывается относительно кадра. В документах отмечается, что кадр нельзя анимировать.
У меня есть идея изменить текст фрейма в методе layoutSubviews () родительского представления, когда родительское представление меняет свой размер.
Пример: * +1022 *
CATransaction.begin()
if let animation = layer.animation(forKey: "position") {
CATransaction.setAnimationDuration(animation.duration)
CATransaction.setAnimationTimingFunction(animation.timingFunction)
} else {
CATransaction.disableActions()
}
textLayer.frame = parentView.bounds
CATransaction.commit()
Правильно ли это решение?