CGAffineTransform échelle à la traduction et à sauter avant l'animation
Je suis aux prises avec un problème concernant les CGAffineTransform échelle et translation, où lorsque j'ai mis une transformation dans un bloc d'animation sur une vue qui a déjà de transformer le point de vue des sauts un peu avant d'animer.
Exemple:
//somewhere in view did load or during initialization
var view = UIView()
view.frame = CGRectMake(0,0,100,100)
var scale = CGAffineTransformMakeScale(0.8,0.8)
var translation = CGAffineTransformMakeTranslation(100,100)
var concat = CGAffineTransformConcat(translation, scale)
view.transform = transform
//called sometime later
func buttonPressed() {
var secondScale = CGAffineTransformMakeScale(0.6,0.6)
var secondTranslation = CGAffineTransformMakeTranslation(150,300)
var secondConcat = CGAffineTransformConcat(secondTranslation, secondScale)
UIView.animateWithDuration(0.5, animations: { () -> Void in
view.transform = secondConcat
})
}
Maintenant, quand buttonPressed() est appelée le point de vue des sauts vers le haut à gauche d'environ 10 pixels avant de commencer à animer. J'ai seulement assisté à cette question avec un concat transformer, à l'aide seulement d'une traduction de transformation fonctionne très bien.
Edit: Depuis que j'ai fait beaucoup de recherches sur la question, je pense que je devrais mentionner que ce problème apparaît indépendamment de si oui ou non la mise en page automatique est activée
CGAffineTransformTranslate(secondScale,150,300)
?Le résultat est exactement le même
Ce qui ne "saute un peu"? Est-il de retour à l'identité de transformation? Est-il animer
secondConcat
de la sauter ou sauter, de retour à concat, animer à secondConcat
?Avez-vous jamais résoudre ce problème? Actuellement, le débogage le même problème ici.
malheureusement, je n'ai pas. J'ai fini par en enroulant une vue à l'intérieur d'une autre afin que je puisse traduire la vue sur l'extérieur et à l'échelle de la vue de l'intérieur. De cette façon j'ai pu contourner le problème.
OriginalL'auteur matteok | 2015-01-13
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré le même problème, mais ne pouvait pas trouver la source exacte du problème. Le saut semble n'apparaître que dans des conditions très particulières: Si le point de vue anime à partir d'une transformation
t1
à une transformationt2
et les deux transformations sont une combinaison d'une échelle et d'une translation (qui est exactement votre cas). Compte tenu de la solution de contournement suivante, qui n'a pas de sens pour moi, je suppose que c'est un bug dans le Noyau de l'Animation.Tout d'abord, j'ai essayé d'utiliser
CATransform3D
au lieu deCGAffineTransform
.Ancien code:
Nouveau code:
Le nouveau code doit être équivalent à l'ancienne (le quatrième paramètre est réglé sur
1.0
ou0
de sorte qu'il n'y a pas de mise à l'échelle/la traduction enz
direction), et en fait, il montre le même saut. Cependant, voici la magie noire: À l'échelle de la transformation, le changement de laz
paramètre à quelque chose de différent de1.0
, comme ceci:Ce paramètre ne doit avoir aucun effet, mais maintenant le saut est allé.
✨
☝️Idem. J'ai rencontré le même problème avec une simple échelle et de la traduction. La couche serait "déplacer" vers la gauche un peu en avant de l'animation. L'application d'un
1.01
échelle de laz
axe fixe le problème.OriginalL'auteur Theo
Ressemble à Apple UIView animation bug interne. Quand Apple interpole
CGAffineTransform
changements entre les deux valeurs pour créer une animation, il devrait faire comme suit:CGAffineTransform
pour chaque étape d'interpolationL'assemblage doit être dans l'ordre suivant:
Mais ressemble à Apple de faire la traduction après la mise à l'échelle et la rotation. Ce bug devrait être corrigé par Apple.
OriginalL'auteur k06a
Au lieu de CGAffineTransformMakeScale() et CGAffineTransformMakeTranslation(), qui créent une transformation à partir d'CGAffineTransformIdentity (en gros, pas de transformation), vous souhaitez mettre à l'échelle et de les traduire en fonction de l'affichage de la transformation en cours à l'aide de CGAffineTransformScale() et CGAffineTransformTranslate(), qui commencent avec la transformation existante.
Aussi, j'ai juste essayé d'utiliser CGAffineTransformTranslate au lieu de CGAffineTransformMakeTranslate et le problème reste le même.
OriginalL'auteur Dave Batton
La source du problème est le manque de perspective de l'information pour la transformer.
Vous pouvez ajouter de la perspective de l'information de la modification de la
m34
propriété de votre transformation 3dOriginalL'auteur Snit
Je ne sais pas pourquoi, mais ce code peut fonctionner
mise à jour:
J'ai réussi à combiner l'échelle, la traduction et la rotation de l'ensemble, de tout transformer etat à une nouvelle transformation de l'état.
Je pense que la transformation est réinterprété au début de l'animation.
le point d'ancrage de commencer à transformer est considéré dans la transformation de nouveau, et puis nous convertir à la vieille transformation.
J'ai aussi essayer de le zScale solution, il semble également fonctionner si la valeur zScale non-1 lors de la première transformation ou à chaque transformation
OriginalL'auteur lbsweek