3J'ai une image qui se manipule au toucher.
Disons que c'est une image d'une flèche qui pointe vers le haut. Une fois qu'il a été tourné de 180 degrés, la flèche pointe maintenant vers le bas, Je veux réinitialiser les propriétés CGAffineTransform afin qu'il pense maintenant qu'il est revenu à 0 degrés .
Je veux cela parce que je dois traduire, faire pivoter, mettre à l'échelle, etc. si l'angle de l'image est 0 OR 180.
Merci d'avance.
édité après 5 réponses:
Hmm, je ne sais pas si l'une de ces réponses fait ce que je voulais. Je m'excuse de ne pas avoir été clair.
Pour éviter le problème ci-dessus et certains autres, je veux tout réinitialiser après qu'il a été tourné de 180. Par exemple, une fois que l'image a tourné à 180 degrés, les propriétés CGAffineTransform savent qu'elle a tourné à 180%. Je veux réinitialiser les propriétés à ce moment-là pour que CGAffineTransform pense que son 0 degrés au lieu de 180, même si l'image est à l'envers visuellement. Je veux que cela se produise sans aucun changement visuel, dès qu'il est tourné à 180 degrés.
J'espère que c'est plus clair ....
Si vous essayez de réinitialiser la transformation, afin que l'image apparaisse comme à l'origine, vous pouvez simplement redéfinir la transformation sur l'identité.
self.imageView.transform = CGAffineTransformIdentity
Si vous souhaitez appliquer des transformations arbitraires à l'image transformée, la chose la plus simple à faire serait d'utiliser les méthodes CGAffineTransform qui acceptent une transformation existante. Envoyez simplement la transformation existante. Par exemple:
CGAffineTransform scale = CGAffineTransformMakeScale(zoom, 1);
self.imageView.transform = CGAffineTransformConcat(self.imageView.transform, scale);
Si vous avez VRAIMENT besoin de l'image telle qu'elle apparaît sans aucune transformation, vous devrez la redessiner dans une autre image. Ce n'est pas si difficile non plus, mais je ne le recommande pas comme première solution. Ce code fonctionne dans le contexte d'une catégorie UIView pour une vue arbitraire, y compris un UIImageView:
- (UIImage *) capture {
CGRect screenRect = self.frame;
CGFloat scale = [[UIScreen mainScreen] scale];
UIGraphicsBeginImageContextWithOptions(screenRect.size, YES, scale);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor blackColor] set];
CGContextFillRect(ctx, screenRect);
[self.layer renderInContext: ctx];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
Swift, Swift 4 et Swift 5
Vous pouvez réinitialiser un CGAffineTransform avec ceci:
self.imageView.transform = CGAffineTransform.identity
La version courte est juste .identity
ainsi:
self.imageView.transform = .identity
A fait quelque chose de similaire mais de plus simple hier.
Trouvez toute valeur de transformation existante. Ensuite, mettez cela comme décalage de la nouvelle transformation.
Voir des exemples:
// Rotate right/clockwise
CGFloat radians = atan2f(imageView.transform.b, imageView.transform.a);
CGFloat degrees = radians * (180 / M_PI);
// Yeah yeah, I like degrees.
CGAffineTransform transform = CGAffineTransformMakeRotation((90 + degrees) * M_PI/180);
imageView.transform = transform;
// Rotate left/anticlockwise
CGFloat radians = atan2f(imageView.transform.b, imageView.transform.a);
CGFloat degrees = radians * (180 / M_PI);
// Yeah yeah, I like degrees.
CGAffineTransform transform = CGAffineTransformMakeRotation((-90 + degrees) * M_PI/180);
imageView.transform = transform;
C'est juste un indice si vous voulez vivre avec l'addition de valeurs de transformation existantes à de nouvelles transformations pour faire le bon mouvement. Utilisez les mêmes méthodes pour l'échelle, etc.
Certains ont suggéré d'utiliser CABasicAnimation avec la propriété additive définie sur YES. Mais cela ne pouvait pas fonctionner.
Objectif C:
self.transform = CGAffineTransformIdentity;
Vous pouvez combiner plusieurs transformations. Par exemple:
CGAffineTransform rotation = CGAffineTransformMakeRotation(up ? 0 : M_PI);
imageView.transform = CGAffineTransformScale(rotation,xScale, yScale);