我正在尝试以编程方式设置框架的原点。
方法1:
button.frame.origin.y = 100;
方法二:
CGRect frame = button.frame;
frame.origin.y = 100;
我尝试了方法 1,但它不起作用(显示错误,说 Expression is not assignable)。方法 2 有效。为什么会这样?
需要关于我做对的事情的指导。
您不能执行方法 #1 的原因是框架的各个属性是只读的。但是,整个框架本身是可写/可分配的,因此您可以执行方法 #2。
你甚至可以做这样的技巧:
CGRect newFrame = button.frame;
newFrame.origin.y += 100; // add 100 to y's current value
button.frame = newFrame;
你知道
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)
这是因为如果您能够直接更改框架的原点或大小,您将绕过 UIView 的 frame 属性的 setter 方法。由于多种原因,这将是不好的。
UIView 将没有机会收到有关其框架更改的通知。但它必须知道这些更改才能更新它的子视图或重绘自身。
button.frame.origin.y = 100;
等于以下调用:
[button getFrame].origin.y = 100;
其中[button getFrame]
给你复制的CGRect
.
您正在尝试设置结构的结构的变量。没有指向UIView
结构的指针(因为它是基本的C struct
,所以不能指向)。因此,改为复制。
所以基本上,你是在复制结构并设置它。但是,那是行不通的。