2017-08-20 6 views
0

J'ai deux boutons et un UIImageView dans ma vue principale. Un bouton essaie de faire pivoter l'UIImageView de 30 degrés, et l'autre met à jour le cadre de l'UIImageView.Étrange écrasement lors de la mise à jour du cadre UIImageView après rotation avec CGAffineTransform

Je ne m'attendrais pas à régler le cadre sur lui-même pour affecter quelque chose visuellement, mais il semble plutôt "écraser" l'image si elle est dans une rotation autre que l'orientation par défaut. Je suis tombé dessus, car je voulais mettre à jour le cadre de UIImageView afin de changer ses coordonnées x et y après la rotation. Par conséquent, le bouton de rotation semble fonctionner correctement tant que je n'appuie jamais sur le bouton de mise à jour de l'image. Si je pousse le second bouton alors que la vue est toujours tournée, elle écrase l'image dans un état que je ne comprends pas, ou sait comment l'annuler.

Vidéo du second bouton "squishing" l'image: https://streamable.com/ba7zd

Vidéo du second bouton seulement "squishing" alors que la rotation n'est pas l'orientation par défaut: https://streamable.com/vo3cd

Quelle est la raison pour laquelle cette est passe? This question et this question semblent tous deux capturer un scénario similaire, mais je ne sais pas comment appliquer l'une ou l'autre solution.

Dans le ViewController:

@IBOutlet weak var dog: UIImageView! 

@IBAction func breakRotate(_ sender: UIButton) { 
    self.dog.frame = self.dog.frame // squishes if rotated 
} 

@IBAction func rotateDog(_ sender: UIButton) { 
    UIView.animate(withDuration: 1.5, delay: 0, options: [.allowUserInteraction], animations: { 
     self.dog!.transform = self.dog!.transform.rotated(by: CGFloat(0.523599)) // 30 degrees in radians 
    }) 
} 

Image:

enter image description here

Répondre

2

La valeur retournée par frame propriété après l'application d'une rotation n'est pas le cadre pivotée, Il est le rectangle de délimitation minimale qui comprend la vue, qui peut être différente en taille de l'image réelle. (Le documentation dit le cadre sera défini et doit être ignorée, mais en réalité, il est de retour le rect englobante minimum)

Lorsque vous appliquez une transformation à une vue que vous ne devriez pas changer le cadre, car il peut interférer avec la transformation .

Si vous voulez changer la position après transformation vous devez modifier la propriété center de la vue:

dog.center = newCenterPoint 

Enfin, comme la raison pour laquelle vous voyez cet effet inhabituel, quand vous faites le transformer prend automatiquement en charge de redimensionner le cadre au nouveau rectangle de délimitation minimum sans gâcher la taille de votre image, mais lorsque vous appliquez ce nouveau cadre modifié à la vue, il ne saura pas que c'est le résultat d'une transformation et essaiera de redimensionner votre image l'image et c'est pourquoi votre image est écrasée comme ça.