我怎样才能改变变换的值?

时间:2009-07-24 21:58:56

标签: iphone matrix transform

例如,我可以像这样访问它们:

self.layer.transform.m32

但我无法为其分配值,例如

self.layer.transform.m32 = 0.3f;

它表示无效的分配。但实际上不应该有用吗?

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

至少Xcode会识别矩阵中的所有这些字段。

3 个答案:

答案 0 :(得分:4)

您可以访问名为“transform”(CALayer类)的属性,即使用CATransform3D参数类型调用setter函数。 因此,您无法直接访问CATransform3D结构成员。

您可能需要先初始化临时变量(CATransform3D类型),然后将其完全分配给属性。

尝试以这种方式访问​​的任何属性都会发生同样的事情。

例如:

view.frame.origin.x = 0; //will **not** work for UIView* view

工作样本(通过临时变量):

CATransform3D temp = self.layer.transform; //create  temporary copy
temp.m32 = 0.3f; 
self.layer.transform = temp; //call setter [self.layer setTransform:temp]- mean the same

答案 1 :(得分:0)

我似乎没有遇到以这种方式访问​​和设置变换的麻烦;

CATransform3D t = view.transform;
NSLog(@"t.m32 = %f, t.m34 = %f", t.m32, t.m34);
t.m34 = 100.5;
NSLog(@"t.m32 = %f, t.m34 = %f", t.m32, t.m34);
view.transform = t;

答案 2 :(得分:0)

self.layer.transform.m32 = 0.3f;不会对图层的转换做任何事情。

self.layer.transform返回一个CATransform3D,它不是一个对象。这意味着它已被复制,如果您更改.m32,则表示您正在更改副本,而不是图层的CATransform3D。

这可行(类似于mahboudz'代码示例):

CATransform3D t = self.layer.transform; // t is a copy of self.layer.transform
t.m32 = 0.3f; // modify the copy
self.layer.transform = t; // copy it back into self.layer.transform