问题 为什么“表达式不可分配”(UIView.frame.origin)?


这个问题不是“我怎么做”,而是关于Objective-C中某些Class属性的“为什么会这样”。

我知道下面的两个例子是不允许的,并导致错误(“表达式不可分配”):

self.myUIView.frame.origin.x = 50;
self.myUIView.frame.origin = CGPointMake(50,50);

并且正确的方法是创建一个新的CGRect,设置所需的值然后分配它:

CGRect rect = self.myUIView.frame;
rect.origin = CGPointMake(50, 50);
self.myUIView.frame = rect;

我想明白为什么会这样。

CGRect是一个包含两个结构的结构。限制是否与分配结构有关,以防止可能溢出该内存的赋值?或者更多的是关于公共和私人财产的公约?

我意识到这似乎是一个小问题或基本问题,但我认为清除这些基本问题的泥泞/不良理解很重要。


6349
2017-08-26 18:24


起源



答案:


这是因为如果您能够直接更改框架的原点或大小,则可以绕过UIView框架属性的setter方法。由于多种原因,这会很糟糕。

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

另外,为 KVO 要工作,你必须使用正确的setter(通过使用setFrame:或点表示法)。


9
2017-08-26 18:28





分配元素的问题 struct 是拥有这个的阶级 struct 我不知道 struct 已经变了。当你谈论一个框架的起源时,这并不好: UIView 预计会因为改变原点而移动,但由于班级不会被告知变更,因此不会发生任何移动。

设置 frame另一方面,可以检测到,因为 UIViewsetFrame 方法将被调用。这是其中的代码 UIView 可以负责调整大小,重新定位等。


5
2017-08-26 18:30