I realize that the contentsRect
property of CALayer
(documentation here) allows one to define how much of the layer to use for drawing, but I do not understand how the coordinate system works, I think.
It seems that when the width/height are smaller, the area used for content is bigger and vice versa. Similarly, negative x,y positions seem to move the content area down and to the right which is the opposite of my intuition.
Can someone explain why this is? I'm sure there is a good reason, but I assume I'm missing some graphics programming background.
No, you're thinking about it incorrectly.
The
contentsRect
specifies which part of thecontents
image will be displayed in the layer.That part is then arranged in the layer according to the
contentsGravity
property.If this is
kCAGravityResize
, the default, this will cause the part to be resized to fit the layer. That would explain the counterintuitive behavior you're seeing -- you makecontentsRect
smaller, but the layer appears to be the same size, and it appears to "zoom in" on the selected part of the image. You might find it easier to understand if you setcontentsGravity
tokCAGravityCenter
, which won't resize.Most of the time, you would set the
contentsRect
to some sub-rect of the identity rect{ {0, 0}, {1, 1} }
, so you choose to see only part of the contents.(Think of these as percentages if you like -- if
contentsRect
has a size of{0.5, 0.5}
, you're choosing 50% of thecontents
.)If part of the
contentsRect
goes outside the identity rect, then CA will extend the edge pixels of thecontents
outwards. This is handy in some cases, but it's not something you'd use on its own -- you'd use it in combination with a mask or with some other layers to achieve some effect.