我正在努力加深对这些机制的理解。我有一个启用触摸的UIView,可以更新自己的center
属性。
我的理解是frame
属性是center
和bounds
的综合函数。假设这是真的,我将一个观察者放在我的可触摸/可移动视图上,该视图观察到它的frame
属性。但是,观察者从未收到有关帧的更改的通知(这会在center
更改时自动发生)。如果我直接观察center
,它会按预期工作。
为什么不在这里观察frame
?
请注意,我知道我可以直接观察center
,这很好。我还可以使用frame
的will / did方法将更改包含在中心,然后也可以使用:
[self willChangeValueForKey:@"frame"];
[self setCenter:center];
[self didChangeValueForKey:@"frame"];
但我主要是想了解为什么它不像我期望的那样开箱即用,以防我在这里概念性地遗漏了一些东西,无论是关于KVO还是关于视图几何。
感谢。
答案 0 :(得分:10)
观察frame
不起作用的主要原因是因为没有UIKit属性被定义为符合KVO,除非明确记录为符合KVO标准。
你没有遗漏任何东西 - 不幸的是,UIKit不支持你试图用观察做的事情。
答案 1 :(得分:4)
你不能在这里观察帧的原因是因为它们是来自底层模型(层)的或多或少的派生值。对frame
,center
和bounds
的所有更改都会影响图层属性。如果您热衷于观察上述属性的所有更改,则应观察图层的position
属性。