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 using CGBitmapContextCreate
or CGPDFContextCreate
), 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 in UIGraphicsBeginImageContext
. (The Quartz 2D Programming Guide explains this.) You can check this by looking at the current transform matrix (using CGContextGetCTM
). You will find that it has a -1
in its d
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 the UIView
transform
property.
value
happen to be π/2? – Iñigo Beitia