为什么“expression式不能赋值”(UIView.frame.origin)?
这个问题不是一个“我该怎么做”,而是一个“为什么是这个”,关于Objective-C中的一些类属性。
我明白,下面的两个例子是不允许的,并导致错误(“expression式不能分配”):
self.myUIView.frame.origin.x = 50; self.myUIView.frame.origin = CGPointMake(50,50);
而正确的方法是创build一个新的CGRect,设置所需的值然后赋值:
CGRect rect = self.myUIView.frame; rect.origin = CGPointMake(50, 50); self.myUIView.frame = rect;
我想明白这是为什么。
CGRect是一个包含两个结构的结构。 限制与结构如何分配有关,是为了防止可能溢出内存的分配? 还是更多的是关于公共和私有财产的公约?
我意识到这似乎是一个小问题/基本问题,但我认为清楚这些基本types的事情的泥泞/坏理解是重要的。
这是因为如果你能够直接改变一个框架的原点或大小,你可以绕过UIView框架属性的setter方法。 这会因为多种原因而不好。
UIView将没有机会被通知有关框架的变化。 但它必须知道这些更改才能更新其子视图或重绘本身。
而且,为了KVO的工作,你必须使用正确的setter(通过使用setFrame:或点符号)。
分配struct
元素的问题是,拥有该struct
的类将不知道struct
已被更改。 当你谈论一个框架的起源时,这是不好的: UIView
应该改变原点,但是由于这个类不会被通知这个改变,所以不会发生移动。
另一方面,设置frame
可以被检测,因为UIView
的setFrame
方法将被调用。 这是UIView
可以负责resize,重新定位等等的代码。