In my experiment, i conclude these:
YourView.transform = CGAffineTransformMakeRotation( positive value );
will rotate the view clockwise, and
YourView.transform = CGAffineTransformMakeRotation( Negative value );
will rotate the view counterclockwise,
But the document says:
The angle, in radians, by which to rotate the affine transform. In iOS, a positive value specifies counterclockwise rotation and a negative value specifies clockwise rotation.
does those contradict with each other?
Your confusion is quite understandable.
In truth, a positive angle represents a rotation from the positive X axis toward the positive Y axis. A negative angle represents a rotation from the positive X axis toward the negative Y axis.
The “native” Core Graphics coordinate system is modeled after the standard Cartesian coordinate system, in which the Y axis increases upward on the page. In this system, a positive angle represents a counter-clockwise rotation:
So if you create your own
CGContext
(for example, by usingCGBitmapContextCreate
orCGPDFContextCreate
), rotations will work as you expect.However, computer systems have historically used a coordinate system in which the Y axis increases downward on the page. In a flipped coordinate system like this, a positive angle represents a clockwise rotation:
Notice that in both coordinate systems, a positive angle rotates from the positive X axis toward the positive Y axis.
It turns out that UIKit flips the coordinate system of the graphics contexts that it creates for you. This includes the graphics context it sets up before sending you
drawRect:
and the graphics context it sets up inUIGraphicsBeginImageContext
. (The Quartz 2D Programming Guide explains this.) You can check this by looking at the current transform matrix (usingCGContextGetCTM
). You will find that it has a-1
in itsd
element, meaning that the Y axis is flipped.A
UIView
also uses a flipped coordinate system for laying out its subviews, which affects the meaning of theUIView
transform
property.