UIView KVO: Почему изменения "center" не вызывают уведомления KVO для "frame"? - PullRequest
3 голосов
/ 20 мая 2011

Я пытаюсь углубить свое понимание этих механизмов. У меня есть UIView с сенсорным включением, и я могу обновить свое собственное свойство center.

Насколько я понимаю, свойство frame является синтезированной функцией center и bounds. Предполагая, что это правда, я поставил наблюдателя на свой осязаемый / подвижный вид, который наблюдал его свойство frame. Но этот наблюдатель никогда не уведомляется об изменениях кадра (которые происходят автоматически при изменении center). Если я наблюдаю center напрямую, он работает как положено.

Почему наблюдение frame не работает здесь?


Обратите внимание, что я знаю, что могу просто наблюдать center напрямую, и это нормально. Я также могу окружить изменение по центру методами will / did для frame, что также работает:

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

Но я в основном просто хочу понять, почему это не работает «из коробки» так, как я ожидаю, что оно будет работать, на случай, если я упущу что-то здесь концептуально, будь то в KVO или в геометрии вида.

Спасибо.

Ответы [ 2 ]

10 голосов
/ 23 мая 2011

Основная причина, по которой наблюдение frame не работает, заключается в том, что ни одно свойство UIKit не определено как совместимое с KVO, если не указано иное, чтобы оно было совместимо с KVO.

Вы ничего не упускаете - К сожалению, UIKit не поддерживает то, что вы пытаетесь сделать с наблюдением.

4 голосов
/ 23 мая 2011

Причина, по которой вы не можете наблюдать за кадром здесь, потому что они являются более или менее производными значениями от базовой модели, слоя.Все изменения frame, center и bounds влияют на свойства слоя.Если вы заинтересованы в наблюдении за всеми изменениями в вышеупомянутых свойствах, вы должны соблюдать свойство position слоя.

...