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's 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设置为“frame”,则没有错误,但方法observeValueForKeyPath永远不会被调用。 我猜想一个框架的起源更改不算作框架的变化..?

我如何完成添加观察者到UIView的frame.origin.y?

虽然我不能像我最初想要的那样完全解决我的问题,但我发现我能够正确地将观察者添加到UIView的中心。 通过监视我的视图的中心,我可以确定框架的原点已经改变。

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

与ReactiveCocoa一样简单:

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

例如。

我不认为有可能只观察帧的y值。 但不是观察框架属性,你可以覆盖setFrame:方法

喜欢这个:

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