11

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

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

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 是一个包含两个结构的结构。限制是否与结构的分配方式有关,以防止可能溢出该内存的分配?或者它更像是关于公共和私人财产的约定?

我意识到这似乎是一个小问题/基本问题,但我认为澄清对这些基本事物的模糊/错误理解很重要。

4

2 回答 2

9

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

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

此外,要使 KVO工作,您必须使用正确的设置器(使用 setFrame: 或点表示法)。

于 2012-08-26T18:28:20.260 回答
6

分配元素的问题struct是拥有 的类struct将不知道struct已更改。当您谈论框架的原点时,这并不好:UIView预计会随着原点的变化而移动,但是由于不会通知类更改,因此不会发生移动。

frame另一方面,可以检测到设置,因为会调用UIView'方法。setFrame这是UIView可以处理调整大小、重新定位等的代码。

于 2012-08-26T18:30:20.350 回答