web-dev-qa-db-fra.com

A propos du sens de rotation de CGAffineTransformMakeRotation?

J'essaie d'utiliser CGAffineTransformMakeRotation, et je me réfère au document Apple qui dit

L'angle, en radians, selon lequel cette matrice fait pivoter les axes du système de coordonnées. Sous iOS, une valeur positive indique la rotation dans le sens inverse des aiguilles d'une montre et une valeur négative indique la rotation dans le sens des aiguilles d'une montre . Sous OS X, une valeur positive spécifie la rotation dans le sens des aiguilles d'une montre et une valeur négative spécifie la rotation dans le sens inverse des aiguilles d'une montre.

Donc, je passe le paramètre 90 degrés, il devrait tourner dans le sens antihoraire.
self.myView est une vue de couleur d'arrière-plan gris et une vue en carré rouge sert uniquement à voir le sens de rotation.

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[self.myView setTransform:rotation];

Before RotationAfter Rotation

Mais pourquoi tourne-t-on dans le sens des aiguilles d'une montre?
J'essaie de l'utiliser dans un simulateur et que l'appareil a le même résultat, rotation dans le sens des aiguilles d'une montre
Et ensuite, essayez d’utiliser l’animation:

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[UIView animateWithDuration:0.5
                 animations:^{
                     self.myView.transform = rotation;
                 }
                 completion:^(BOOL finished) {
                     NSLog(@"%@", NSStringFromCGAffineTransform(self.myView.transform));
                 }];

Il en résulte le même résultat, rotation dans le sens des aiguilles d'une montre.

Quelqu'un peut-il expliquer pourquoi, Merci pour la réponse.

17
tom19830924

Ceci est une erreur dans la documentation.

Ici ils décrivent la matrice et fournissent les équations qu'ils utilisent pour effectuer la transformation:

enter image description here

Si vous faites le calcul, vous verrez que pour les angles positifs , cela donne une rotation dans le sens inverse des aiguilles d'une montre lorsque Y la direction de l'axe est vers le haut comme dans OS X et dans le sens des aiguilles d'une montre lorsque Y axe dirigé vers le bas sous sous iOS

Par exemple, vous pouvez essayer de transformer le point (5,0) à 90 degrés, vous obtiendrez (0,5), ce qui signifie sens horaire pour iOS et sens inverse pour OS X.

Le même document contient toujours la (fausse) partie que vous avez citée:

Dans iOS, une valeur positive spécifie une rotation dans le sens contraire des aiguilles d'une montre Et une valeur négative spécifie une rotation dans le sens des aiguilles d'une montre. Sous OS X, une valeur positive de Indique la rotation dans le sens des aiguilles d'une montre et une valeur négative Indique la rotation dans le sens inverse des aiguilles d'une montre.

Ce qui est clairement faux , car les équations (qui font partie du même document et qui sont jolies les équations de rotation standard ) disent le contraire.

15
Serhii Yakovenko

Ce comportement est correct et la documentation le décrit correctement. 

Vous avez affaire à deux systèmes de coordonnées différents. Le système de coordonnées de Core Graphics a (0, 0) en bas à gauche, alors que le système de coordonnées de UIKit a (0, 0) en haut à gauche. Les deux systèmes de coordonnées ont un axe X avec 0 à gauche. En d'autres termes, le système de coordonnées UIKit est le système de coordonnées Core Graphics inversé verticalement. L'image suivante montre la différence:

 Comparison of UIKit and Core Graphics coordinate systems


Maintenant, regardons votre citation:

L'angle, en radians, selon lequel cette matrice fait pivoter les axes système Des coordonnées. Dans iOS, une valeur positive spécifie une rotation dans le sens contraire des aiguilles d'une montre Et une valeur négative spécifie une rotation dans le sens des aiguilles d'une montre.

À première vue, cela semble faux, mais vous avez oublié quelque chose. Citation de la référence CGAffineTransformMakeRotation . Cela fait partie de Core Graphics référence, pas la référence UIKit. Il fait référence à la rotation dans le sens inverse des aiguilles d'une montre dans le système de coordonnées de Core Graphics .

Vous pouvez imaginer cette rotation dans votre tête en retournant ce que vous voyez à l'écran verticalement et en imaginant à quoi ressemblerait la rotation.

En fait, la référence CGAffineTransformMakeRotation a un élément de discussion qui continue à documenter ceci:

Le sens de rotation réel dépend de l'orientation du système de coordonnées De la plate-forme cible, qui est différente sous iOS et MacOS.


L'élément de discussion relatif à la rotation (par :) de la méthode de CGContext décrit un peu mieux ce comportement:

La direction dans laquelle le contexte est pivoté peut sembler être modifiée par L'état de la matrice de transformation actuelle avant l'exécution de cette fonction . Par exemple, sur iOS, un UIView applique une transformation à Le contexte graphique qui inverse l’axe des Y (en le multipliant par -1). La rotation du système de coordonnées utilisateur sur le système de coordonnées précédemment inversé entraîne une rotation dans le sens opposé (C’est-à-dire que des valeurs positives semblent faire pivoter le système de coordonnées dans Dans le sens des aiguilles d’une montre).

7
Ben Kane

Pour obtenir une rotation dans le sens inverse des aiguilles d'une montre, définissez l'angle d'ur (U) dans -ve , Par exemple:

*

imageToBeRotated.transform = CGAffineTransformMakeRotation(-angle); // for anti-clockwise rotation
imageToBeRotated.transform = CGAffineTransformMakeRotation(angle); // for clockwise rotation

*

7
Maniac One

J'ai un code simple pour faire pivoter l'image dans une direction différente. 

int Count==1;
- (IBAction)Btn_Image:(id)sender {
if (Count==1) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationRight];
    self.Img_Canvas.image = image;
}
else if (Count == 2) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationDown];
    self.Img_Canvas.image = image;
}
else if (Count == 3) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationLeft];
    self.Img_Canvas.image = image;
}
else if (Count == 4) {
    Count = 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationUp];
    self.Img_Canvas.image = image;
}}
0
Yogesh Tarsariya

Ne vous trompez pas. C'est faux dans la documentation Apple.

CGAffineTransformMakeRotation (-angle) // pour une rotation dans le sens anti-horaire CGAffineTransformMakeRotation (angle) // pour une rotation dans le sens des aiguilles d'une montre

0
Sridhara Shetty