使用点运算符设置frame.size

时间:2010-12-13 19:33:33

标签: objective-c

我有一个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点操作符,我认为它应该可以工作。如果我遗漏了任何内容,请启发

3 个答案:

答案 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;

底线是你不能用这种方式设置函数结果的子域。即使你可以,它也不会影响原件而只影响副本。