web-dev-qa-db-fra.com

Réinitialisation de CGAffineTransform

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.

  1. Une image avec la flèche pointant vers le haut est touchée et déplacée vers la droite - tout va bien.
  2. L'image est tournée avec le geste de rotation et tournée à 180 degrés - tout va bien
  3. L'image est maintenant touchée et déplacée vers la droite - Étant donné que les coordonnées sont à l'envers, l'image saute maintenant de haut en bas, ce qui rend mes autres séquences d'animation délirantes.

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 ....

37
Gizmodo

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;
}
77
Micah Hainline

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
38
skymook

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.

5
Gurpartap Singh

Objectif C:

self.transform = CGAffineTransformIdentity;
2
RemembranceNN

Vous pouvez combiner plusieurs transformations. Par exemple:

CGAffineTransform rotation = CGAffineTransformMakeRotation(up ? 0 : M_PI);
imageView.transform = CGAffineTransformScale(rotation,xScale, yScale);
2
Ed Marty