0
votes

Animez une étiquette rotative à Swift?

J'essaie d'animer une étiquette rotarée comme ceci: xxx

Lorsque je commente la ligne de rotation du code (et conservez l'étiquette non prise), cela fonctionne bien. Mais lorsque je le fais pivoter, l'étiquette démarre hors de l'écran au début de l'animation: Entrez la description de l'image ici

Lorsque je commente l'animation, l'étiquette est parfaitement tournée parfaitement (mais aucune animation évidemment): Entrez la description de l'image ici

Comment puis-je faire pivoter l'image et l'animer, sans avoir ce placement étrange?

Edit: Pour clarifier: je veux Étiquette Pour démarrer en rotation au centre de l'écran et déplacez simplement l'étiquette. Je ne veux pas faire pivoter l'image pendant l'animation.


3 Réponses :


0
votes

La première transformée est OT du bloc d'animation, c'est pourquoi il commence à sortir de l'écran. Vous devez le déplacer dans le bloc d'animation et utiliser un gestionnaire d'achèvement pour animer à nouveau.

UIView.animate(withDuration: 2.0, animations: {
    //
}, completion: { (result) in
    //
})
  • Soyez prudent, l'angle est dans les radians. Li> ul> p>


0 commentaires

1
votes

Vous pouvez effectuer l'animation avec cabasicanimation forte> car il vous donnera plus de contrôle sur l'animation et il dispose d'un bloc d'achèvement sur lequel vous pouvez masquer votre étiquette également sur votre exigence.

    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()


0 commentaires

1
votes

La bonne réponse est que vous êtes censé concaténer les matrices de transformation. Si vous ne voulez pas faire d'algèbre linéaire, le moyen facile est que vous utilisez la transformation pour définir la rotation et n'annacez pas, puis animer le cadre / le centre de la vue.

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 commentaires