这个问题不是“我怎么做”,而是关于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是一个包含两个结构的结构。限制是否与分配结构有关,以防止可能溢出该内存的赋值?或者更多的是关于公共和私人财产的公约?
我意识到这似乎是一个小问题/基本问题,但我认为清除这些基本问题的泥泞/不良理解很重要。
答案 0 :(得分:9)
这是因为如果你能够直接改变一个帧的原点或大小,你可以绕过UIView的frame属性的setter方法。由于多种原因,这会很糟糕。
UIView没有机会收到有关其框架更改的通知。但它必须知道这些更改才能更新它的子视图或重绘自己。
此外,要使KVO起作用,您必须使用正确的setter(使用setFrame:或点表示法)。
答案 1 :(得分:5)
分配struct
元素的问题在于拥有struct
的类不知道struct
已被更改。当你谈论一个框架的起源时,这并不好:UIView
预计会因为改变原点而移动,但由于不会通知该类改变,所以不会发生移动。
另一方面,可以检测到设置frame
,因为将调用UIView
的{{1}}方法。这是setFrame
可以处理调整大小,重新定位等的代码。