J'essaie d'animer une étiquette rotarée comme ceci: 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:
p> Lorsque je commente l'animation, l'étiquette est parfaitement tournée parfaitement (mais aucune animation évidemment):
p> Comment puis-je faire pivoter l'image et l'animer, sans avoir ce placement étrange? P> 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. P> p>
3 Réponses :
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 // })
Vous pouvez effectuer l'animation avec 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()
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 } } }
Aussi Stackoverflow.com/a/41398481/294884
et Stackoverflow.com/q/22887629/294884