UIView KVO:为什么不改变“中心”导致“框架”的KVO通知?

时间:2011-05-20 16:40:13

标签: ios uiview key-value-observing

我正在努力加深对这些机制的理解。我有一个启用触摸的UIView,可以更新自己的center属性。

我的理解是frame属性是centerbounds的综合函数。假设这是真的,我将一个观察者放在我的可触摸/可移动视图上,该视图观察到它的frame属性。但是,观察者从未收到有关帧的更改的通知(这会在center更改时自动发生)。如果我直接观察center,它会按预期工作。

为什么不在这里观察frame


请注意,我知道我可以直接观察center,这很好。我还可以使用frame的will / did方法将更改包含在中心,然后也可以使用:

[self willChangeValueForKey:@"frame"];
[self setCenter:center];
[self didChangeValueForKey:@"frame"];

但我主要是想了解为什么它不像我期望的那样开箱即用,以防我在这里概念性地遗漏了一些东西,无论是关于KVO还是关于视图几何。

感谢。

2 个答案:

答案 0 :(得分:10)

观察frame不起作用的主要原因是因为没有UIKit属性被定义为符合KVO,除非明确记录为符合KVO标准。

你没有遗漏任何东西 - 不幸的是,UIKit不支持你试图用观察做的事情。

答案 1 :(得分:4)

你不能在这里观察帧的原因是因为它们是来自底层模型(层)的或多或少的派生值。对framecenterbounds的所有更改都会影响图层属性。如果您热衷于观察上述属性的所有更改,则应观察图层的position属性。