我很好奇UIView如何将其.frame属性成员设为只读。 显然,如果我为自己声明并初始化CGRect,我可以使用点符号来修改结构的成员。
但是如果我尝试用UIView的框架来做这件事,它就不起作用了。 私有实现怎么样?
答案 0 :(得分:2)
由于框架是结构(CGRect),因此它是通过值传递的,而不是引用。因此,编译器不允许您对永远不能引用的值的副本进行赋值。
如果您将CGRect作为属性添加到您的班级,它的行为方式将相同,不需要特殊的Apple秘密酱。
答案 1 :(得分:2)
如果您首先将帧分配给本地rect变量,您将发现可以更改该局部变量。
CGRect frame = view.frame;
frame.origin.x = 0; // this appears to work
但是该框架现在是本地副本,而不是视图的实际框架,您需要将其设置回来:
view.frame = frame; // set the updated struct.
你不能像这样一步完成:
view.frame.origin.x = 0; // nope!
因为您无法在不先将其分配的情况下更改成员字段。那是因为如果你不分配它,编译器只会让你编辑一个立即消失的结构的“临时”副本。因为这对任何事都没有影响,所以不允许这样做,这会阻止你意外地认为它会做一些有用的事情。
这里可能令人困惑的是用于访问视图(.
)上的属性的符号,这与用于访问结构成员的符号相同,但实际上这些符号有所不同事情; view.frame
中的点是[view frame]
的语义等价物,它是frame属性的访问器,返回rect结构的副本。 (无法直接在视图对象外部对视图对象内部框架的版本进行操作。)
答案 2 :(得分:0)
来自文档:
如果您不想通过setter方法更改属性,可以向属性声明添加一个属性,以指定它应该只读:
@property (readonly) UIView *testView;
testView.frame.origin.x=100; //expresison not assignable
testView.frame.size.height=100; //expression not assignable