如何在保持积分原点的同时拉伸CALayer?

时间:2011-03-17 16:26:17

标签: iphone core-animation

我正试图通过对它应用CATransform3DMakeScale来扩展我所拥有的UIView:

CATransform3DMakeScale(0.9, 1.0 - (0.1 * (path.row - midPath.row)), 1)

这个问题有两个方面:它给我留下了分数帧/边界,我似乎无法圆形或地板,它将我的框架的原点向下拉,使得它的原点不再是0。

有没有办法可以只在一个方向拉伸我的图层?换句话说,保持x和y原点固定并向该原点拉伸或远离它。

此外,是否存在CATransform3D中不同mxx变量影响的文档?我环顾四周,找不到任何东西,试验和错误只让我到目前为止。

1 个答案:

答案 0 :(得分:2)

如果您想在拉伸CALayer时保持固定的原点,您可以更改其anchorPoint属性,如下所示:

layer.anchorPoint = CGPointMake(0.0f, 0.0f);

anchorPoint确定了哪些变换应用于图层的要点。它也与图层的position属性相关联,因此如果您调整anchorPoint,则可能需要在之后重新定位图层。

通过设置锚点,您应该能够将图层设置为整数原点坐标,并使其与变换一起拉伸。但是,你不会保持整体宽度和高度。

就CATransform3D的m12等元素而言,该结构是4 x 4矩阵:

struct CATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
CGFloat m41, m42, m43, m44;
};
typedef struct CATransform3D CATransform3D;

其中每个值代表矩阵中的一个位置。该矩阵基于OpenGL的3-D矩阵,如模型视图矩阵。核心动画提供辅助函数来完成你需要的大部分矩阵操作,但是你时不时地设置一个矩阵元素(如m34的透视效果) 。

我从未擅长矩阵数学,但你可以查找人们为OpenGL模型视图矩阵背后的数学编写的任何文章,并在此处应用。