2011-03-17 36 views
4

我试图通过施加CATransform3DMakeScale将其伸展一个UIView,我有:如何拉伸CALayer,同时保持完整的原点?

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

问题的,这是双重的:它给我留下了分数帧/界限,这似乎我不能圆或地板,它拉我的框架的起源,以便它的y原点不再是0.

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

此外,CATransform3D中的不同mxx变量会影响哪些文档?我环顾四周,找不到任何东西,而试验和错误只让我目瞪口呆。

回答

2

如果你想伸展你的CALayer时保持一个固定的起源,可以更改其属性anchorPoint类似如下:

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

anchorPoint决定哪些变换应用到图层的地步。它也与你的图层的position属性相关联,所以如果你调整了anchorPoint,那么以后可能需要重新定位图层。

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

至于m12等一个CATransform3D的要素,即结构是4×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模型视图矩阵背后的数学放在一起的任何写法,并在这里应用。

相关问题