Как анимировать ширину CATextLayer с плавным ростом текста - PullRequest
0 голосов
/ 23 мая 2019

У меня есть 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 *enter image description here

Как анимировать увеличение текста одновременно с увеличением родительского представления

Обновление: Я думаю, что проблема с текстовой анимацией возникает из-за того, что длина предложений рассчитывается относительно кадра. В документах отмечается, что кадр нельзя анимировать. У меня есть идея изменить текст фрейма в методе 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()

Правильно ли это решение?

...