Анимировать повернутый ярлык в swift? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь анимировать повернутую метку следующим образом:

@IBOutlet fileprivate weak var loadingLabel: UILabel!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        loadingLabel.transform = CGAffineTransform(rotationAngle: CGFloat(0.2))  // rotation line

        UIView.animate(withDuration: 2.0, animations: {
            self.loadingLabel.transform = CGAffineTransform(translationX: 0, y: self.view.bounds.size.height)
        })
    }

Когда я закомментирую строку кода поворота (и оставлю метку необращенной), она работает нормально.Но когда я поворачиваю его, метка начинается с экрана в начале анимации: enter image description here

Когда я закомментирую анимацию, метка поворачивается совершенно нормально (но неточевидно, анимация): enter image description here

Как мне повернуть изображение и анимировать его, не имея этого странного расположения?

Редактировать: Чтобы уточнить: я хочу меткучтобы начать вращаться в центре экрана, и просто просто переместить метку.Я не хочу вращать изображение во время анимации.

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Вы можете выполнить анимацию с помощью CABasicAnimation , поскольку она даст вам больше контроля над анимацией и имеет блок завершения, на котором вы также можете скрыть свой ярлык по вашему требованию.

    loadingLabel.transform = CGAffineTransform(rotationAngle: CGFloat(0.2))  // rotation line

        let animationKey = "position.y"
        CATransaction.begin()
        let moveYAnimation = CABasicAnimation( keyPath:  animationKey)
        moveYAnimation.fromValue = loadingLabel.frame.origin.y
        moveYAnimation.toValue = self.view.bounds.size.height
        moveYAnimation.duration = 2
        loadingLabel.layer.add( moveYAnimation, forKey: animationKey )

        // Callback function
        CATransaction.setCompletionBlock {
            print("end animation")
            self.loadingLabel.isHidden = true
        }

        // Do the actual animation and commit the transaction
        loadingLabel.layer.add(moveYAnimation, forKey: animationKey)
        CATransaction.commit()

Надеюсь, это поможет вам.

1 голос
/ 28 марта 2019

Правильный ответ: вы должны объединить матрицы преобразования. Если вы не хотите выполнять линейную алгебру, тогда простой способ - использовать преобразование, чтобы установить вращение, а не анимировать его, а затем анимировать кадр / центр представления.

import UIKit

class V: UIViewController {
    @IBOutlet var label: UILabel!
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        label.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 6)
        label.center.x += 300
        UIView.animate(withDuration: 2) {
            self.label.center.x -= 300
        }
    }
}
0 голосов
/ 28 марта 2019

Первое преобразование - это не блок анимации, поэтому оно начинается с экрана.Вы должны переместить его в блок анимации и использовать обработчик завершения для анимации снова.

UIView.animate(withDuration: 2.0, animations: {
            //
        }, completion: { (result) in
            //
        })
  • Будьте осторожны, угол в радианах.
...