2013-07-31 6 views
11

私は、UIViewのフレームの原点の変化する値を監視して対応しようとしています。 マイコード:iOS:UIViewのframe.origin.yにオブザーバを追加していますか?

[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にオブザーバーを追加する方法を教えてください。

+0

あなたは 'observerValueForKeyPath:'でsuperをコールしません。 – Andy

答えて

11

を、私は私ことを見出しましたUIViewの中心にオブザーバを正しく追加することができます。 私のビューの中心を監視することによって、フレームの原点が変更されたと判断することができます。例えば

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

ReactiveCocoa

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

ありがとう!これは私の問題を解決するのに役立ちました! –

2

フレームのy値だけを見ることはできません。しかし、あなたはsetFrame上書きする可能性がある代わりに、フレームのプロパティを観察する:方法このよう

:私は私が最初に望んでいたように、まさに私の問題を解決することができませんでしたが、

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

提案していただきありがとうございます。私はそれを試しましたが、このメソッドは呼び出されていないようです。問題は、私はある時点でframe.origin.yを変更するautolayoutを使用しています(正確には確かではありませんが、コンテナビューがdidMoveToWindowをヒットした時点で行います)。 autolayoutがフレームを変更するために使用する方法を知っていますか? – Sethypie

関連する問題