IOS: Добавление наблюдателя в UIView frame.origin.y?

Я пытаюсь контролировать и реагировать на изменяющееся значение начала кадра UIView. Мой код:

[cell.bottomView addObserver:self forKeyPath:@"frame.origin" options:NSKeyValueObservingOptionNew context:NULL];

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%@ Changed", keyPath);
}

Я получаю следующее сообщение об ошибке, которое я не понимаю:

An instance 0x7587d10 of class NSConcreteValue was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here the current observation info:
<NSKeyValueObservationInfo 0x7587fd0> (
<NSKeyValueObservance 0x7587f70: Observer: 0x7587bd0, Key path: origin, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x7587ff0>
)

Действительно, меня интересует только y-позиция начала координат, но код даже не компилируется, если я установил keyPath в "frame.origin.y".

Если я установил keyPath просто "фрейм", ошибок нет, но метод watchValueForKeyPath никогда не будет вызван. Я предполагаю, что изменение начала кадра не считается изменением кадра.?

Как выполнить добавление наблюдателя в UIView frame.origin.y?

Ответ 1

Хотя я не мог решить свою проблему именно так, как мне захотел, я обнаружил, что могу правильно добавить наблюдателей в центр UIView. Наблюдая за центром моего представления, я могу определить, что исходное состояние кадра изменилось.

[cell.bottomView addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:NULL];

Ответ 2

С ReactiveCocoa так же просто, как:

[RACObserve(self.view, frame) subscribeNext:^(NSNumber *rect) {
        NSLog(@"position y: %f", rect.CGRectValue.origin.y);
    }];

например.

Ответ 3

Я не думаю, что можно наблюдать только значение y фрейма. Но вместо наблюдения за свойством frame вы можете перезаписать метод setFrame:

Вот так:

- (void)setFrame:(CGRect)frame 
{
    [super setFrame:frame]
    if (self.frame.origin.y != frame.origin.y){
         // Do your stuff here
    }
 }