有人可以向我解释CALayer的contentsRect属性的坐标系统吗?

6
我知道CALayercontentsRect属性(文档在这里)可以定义图层用于绘制的区域,但我不理解坐标系统是如何工作的。
似乎当宽度/高度较小时,用于内容的区域更大,反之亦然。同样,负的x、y位置似乎将内容区域向下和向右移动,这与我的直觉相反。
有人能解释一下为什么吗?我确定有一个很好的理由,但我认为我缺少一些图形编程背景。
2个回答

20
CALayer的contentsRect属性(文档在此)允许定义要用于绘制的图层的大小。
不是的,您的思路是错误的。
contentsRect指定了将显示在图层中的contents图像的哪个部分。
然后,该部分根据contentsGravity属性在图层中排列。如果这是kCAGravityResize,默认值,这将使该部分调整大小以适合图层。这就解释了您看到的反直觉行为--您使contentsRect变小,但图层似乎保持相同的大小,并且似乎“放大”了所选图像的一部分。如果将contentsGravity设置为kCAGravityCenter,您可能会发现更容易理解,它不会调整大小。
大多数情况下,您将把contentsRect设置为身份矩形{ {0, 0},{1, 1} }的某个子矩形,因此选择仅查看内容的一部分。
(如果您喜欢,则将这些视为百分比--如果contentsRect的大小为{0.5, 0.5},则您选择了50%的内容。)
如果contentsRect的一部分超出了身份矩形,则CA会向外延伸contents的边缘像素。这在某些情况下很方便,但不是您单独使用的东西--您将与蒙版或其他一些图层结合使用以实现某些效果。

非常好的答案。这样更有意义。您知道是否有任何官方文档来解释这个吗? - Steven Oxley
除了您提供的链接之外,最接近的内容是这部分或者这部分的CA编程指南,但都没有更新包括contentsRect。要进行修复,请单击页面底部的“很好,但...”链接并进行请求。 - Kurt Revis
实际上,对于像CA这样具有许多参数的API,您应该期望需要进行实验。文档不可能描述每个参数组合的情况。它们能做到的最好的就是描述管道,这就是第二个链接试图做的事情。 - Kurt Revis
有没有办法将身份矩形(identity rect)更改为除了{{0, 0},{1, 1}}之外的其他内容? - user102008
你的意思是什么?contentsRect只是任何矩形的标准化表示,无论点或像素尺寸如何。你仍然可以使用该标准化矩形来表示图层内容的任何部分(如果需要,甚至可以将其扩展到超出其边界)。 - CIFilter

0

contentsRect 属性是以单位坐标为度量的。 单位坐标在0到1的范围内指定,并且是相对值(而不是像点和像素这样的绝对值)。在这种情况下,它们是相对于背景图像的尺寸。默认的 contentsRect 是 {0, 0, 1, 1},这意味着整个背景图像默认情况下是可见的。如果我们指定一个较小的矩形,则图像将被裁剪。

实际上可以指定具有负原点或大于{1,1}的尺寸的 contentsRect。在这种情况下,图像的最外层像素将被拉伸以填充剩余区域。

您可以在 Nick Lockwood 的书籍 "iOS CoreAnimation Advanced Techniques" 中找到更多信息。

A custom contentsRect (left) and the displayed contents (right)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接