我有一个UIController,众所周知UIController
与视图相关联,您可以使用合成的getter和setters方法访问它
UIController controller = init code ..
..
controller.view
- >这给了我保留和自动释放的UIView
对象,这将是合成get方法(如果我的综合方法理解是正确的)
controller.view.frame -> this gives me my CGRect struct
controller.view.frame.size -> CGSize struct
为什么我不能直接为这个帧结构赋值
controller.view.frame.size.width = 20;
对于上面的语句我收到此错误“左值作为赋值的左操作数需要左值”
这是一个普通的c点操作符,我认为它应该可以工作。如果我遗漏了任何内容,请启发
答案 0 :(得分:7)
在这种情况下使用点运算符是在幕后使用frame
getter方法。由于frame属性是CGRect
,这是一个简单的C结构,frame
会返回值的副本,而不是指向该值的指针。更改它将修改您在堆栈上本地复制的CGRect,而不是视图的frame属性的CGRect。要更新实际的帧属性,您必须通过setter方法[yourView setFrame:yourNewFrame];
或yourView.frame = yourNewFrame;
。
答案 1 :(得分:1)
最容易解决的是再次设置整个框架
controller.view.frame = CGRectMake(controller.view.frame.origin.x, controller.view.frame.origin.y, 20, controller.view.frame.size.height);
詹姆斯链接中描述了为什么不能直接工作的原因,它只有吸气剂。
答案 2 :(得分:-1)
Dot语法只是语法糖。
在这种情况下,此代码:
controller.view.frame.size.width = 20;
实际上就是这段代码:
[[controller view] frame].size.width = 20;
用C表示,就像这样:
ViewGetFrame(ControllerGetView(controller)).size.width = 20;
底线是你不能用这种方式设置函数结果的子域。即使你可以,它也不会影响原件而只影响副本。