我正在尝试通过对其应用 CATransform3DMakeScale 来拉伸(stretch)我拥有的 UIView:

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

这有两个问题:它给我留下了分数帧/边界,我似乎无法圆形或地板,并且它将我的帧的原点拉下来,使其 y 原点不再为 0。

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

另外,是否有关于 CATransform3D 中不同 mxx 变量影响的文档?我环顾四周,找不到任何东西,而反复试验只能让我走到这一步。

最佳答案

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

layer.anchorPoint = CGPointMake(0.0f, 0.0f);
anchorPoint 确定将变换应用于图层的点。它也与您的图层的 position 属性相关联,因此如果您调整 anchorPoint,您可能需要在之后重新定位您的图层。

通过设置 anchor ,您应该能够将您的图层设置在一个完整的原点坐标处,并随着您的变换而拉伸(stretch)。但是,您不会保持完整的宽度和高度。

就 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 矩阵,如模型 View 矩阵。 Core Animation 提供了辅助函数来执行您需要的大部分矩阵操作,但您会时不时地设置一个矩阵元素(例如用于透视效果的 m34)。

我从来都不擅长矩阵数学,但是您可以查找人们为 OpenGL 模型 View 矩阵背后的数学而编写的任何文章,并在此处应用。

关于iphone - 如何在保持完整原点的同时拉伸(stretch) CALayer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5342055/

10-13 04:29