1

UIView 的属性层在 Apple 的文档中描述如下:

视图的核心动画层用于渲染。(只读)

@property(nonatomic, readonly, retain) CALayer *layer

显然它是只读的。但是在我的项目中,为什么可以设置如下:

NSLog(@"before: %f",self.myView.laye.frame.size.width);
[self.myView.layer setAffineTransform:CGAffineTransformMakeScale(2, 2)];
NSLog(@"after: %f",self.myView.laye.frame.size.width);
//log shows us that the frame is modified 

在这种情况下真的很困惑。任何人都可以帮助我吗?提前致谢!

4

2 回答 2

4

layer属性是只读的,这意味着您不能将图层更改为另一个图层,但是该CALayer属性中包含的对象不是不可变的,您可以设置自己的属性。

你不能这样做:

self.myView.layer = newLayer;
// equivalent to [self.myView setLayer:newLayer];

但你可以这样做:

[self.myView.layer setAffineTransform:CGAffineTransformMakeScale(2, 2)];

setLayer:是您不能使用的选择器。

于 2012-10-11T10:13:19.333 回答
1

CALayer不是 UIKit 的一部分。它是 Quartz Core 框架的一部分

UIView类是 UIKit 的一部分。您可以阅读两者的文档以了解差异

UIView 继承自 NSObject 和 CALayer 也继承自 NSObject 所以在你做的时候: [self.myView.layer setAffineTransform:CGAffineTransformMakeScale(2, 2)];

您没有分配图层,您实际上是直接访问CALayer类图层属性,因此您可以使用图层的位置、大小和变换,正如您在CALayer文档中看到的那样,它允许所有这些事情

于 2012-10-11T10:35:01.587 回答