14

我正在尝试以编程方式设置框架的原点。

方法1:

button.frame.origin.y = 100;

方法二:

CGRect frame = button.frame;
frame.origin.y = 100;

我尝试了方法 1,但它不起作用(显示错误,说 Expression is not assignable)。方法 2 有效。为什么会这样?

需要关于我做对的事情的指导。

4

4 回答 4

26

您不能执行方法 #1 的原因是框架的各个属性是只读的。但是,整个框架本身是可写/可分配的,因此您可以执行方法 #2。

你甚至可以做这样的技巧:

CGRect newFrame = button.frame;
newFrame.origin.y += 100; // add 100 to y's current value
button.frame = newFrame;
于 2013-05-02T07:39:55.917 回答
3

你知道 button.frame.origin.y返回一个值。

如果您使用的是这个,那么您将收到此错误...

表达式不可赋值。

button.frame.origin.y = 100;

所以这是正确的方法

CGRect frame = button.frame;
frame.origin.y = 100;

否则你可以这样做......

button.frame = CGRectMake(button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height)
于 2013-05-02T07:27:25.567 回答
1

这是因为如果您能够直接更改框架的原点或大小,您将绕过 UIView 的 frame 属性的 setter 方法。由于多种原因,这将是不好的。

UIView 将没有机会收到有关其框架更改的通知。但它必须知道这些更改才能更新它的子视图或重绘自身。

于 2013-05-02T07:38:36.273 回答
0
button.frame.origin.y = 100;

等于以下调用:

[button getFrame].origin.y = 100;

其中[button getFrame]给你复制的CGRect.

您正在尝试设置结构的结构的变量。没有指向UIView结构的指针(因为它是基本的C struct,所以不能指向)。因此,改为复制。

所以基本上,你是在复制结构并设置它。但是,那是行不通的。

于 2013-05-02T07:42:23.863 回答