UIView KVO:为什么更改“center”不会导致“frame”的KVO通知?

4
我正在努力加深对这些机制的理解。我有一个启用触摸并可以更新自己center属性的UIView。
我的理解是,frame属性是centerbounds的综合函数。假设这是真的,我在我的可触摸/可移动视图上放置了一个观察器来观察其frame属性。但是当center更改时,该观察器从未收到有关frame更改的通知。如果我直接观察center,它会按预期工作。
为什么在此处观察frame不起作用?
请注意,我知道我可以直接观察center,这很好。我还可以使用frame的will/did方法来包围对center的更改,然后也可以正常工作:
[self willChangeValueForKey:@"frame"];
[self setCenter:center];
[self didChangeValueForKey:@"frame"];

但我主要想了解为什么它不能像我期望的那样开箱即用,以防我在KVO或视图几何方面概念上有所遗漏。

谢谢。


好的,我在框架上使用KVO有一些运气。看这里我是如何做到的。https://dev59.com/t2445IYBdhLWcg3waplH - hfossli
2个回答

11

无法观察frame的主要原因是,除非明确记录为支持KVO(键值观察)的属性,否则没有UIKit属性可用于KVO。

你没有漏掉什么 - 不幸的是,UIKit不支持你正在尝试进行的观察操作。


啊,好的,那就这样吧。我想center通知的事实只是未经记录的幸运。谢谢。 - Ben Zotto
正如Deepak在下面所指出的,你可能更有运气观察“position”,但即使这样也不是百分之百保证。 - Chris Parker

4

你之所以不能在这里观察框架,是因为它们基本上是从底层模型、层派生出来的值。对framecenterbounds的所有更改都会影响层属性。如果你想观察上述属性的所有更改,应该观察层的position属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接