2013-07-31 9 views
11

Ich versuche zu überwachen und auf den sich ändernden Wert des Ursprungs eines UIView-Frames zu reagieren. Mein Code:iOS: Hinzufügen von Beobachter zu einem frame.origin.y eines 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); 
} 

Ich erhalte die folgende Fehlermeldung, die ich nicht verstehe:

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> 
) 

Wirklich, ich bin in der y-Position des Ursprungs nur interessiert, aber der Code wird nicht kompilieren, wenn ich keyPath auf "frame.origin.y" setze.

Wenn ich den SchlüsselPfad einfach auf "Frame" setzen, gibt es keine Fehler, aber die Methode observeValueForKeyPath wird nie aufgerufen. Ich nehme an, dass eine Änderung des Ursprungs eines Frames nicht als Änderung des Frames zählt.

Wie beende ich einen Beobachter zu einem frame.origin.y?

+0

In Ihrem 'observerValueForKeyPath:' rufen Sie nicht super auf. – Andy

Antwort

11

Obwohl ich nicht mein Problem genau in der Art und Weise lösen könnte, die ich wollte anfangs habe ich herausgefunden, dass ich bin in der Lage, Beobachter dem UIView-Zentrum korrekt hinzuzufügen. Durch die Überwachung der Mitte meiner Sicht kann ich feststellen, dass der Ursprung des Frames geändert hat.

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

danke! das half mein Problem zu beheben! –

2

Ich glaube nicht, dass es möglich ist, nur den y-Wert des Rahmens zu beobachten. Doch statt des Rahmens Eigenschaft Beobachten Sie die SetFrame überschreiben könnte: Methode

So:

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

Danke für den Vorschlag. Ich habe es ausprobiert, aber diese Methode scheint nicht aufgerufen zu werden. Die Sache ist, ich benutze Auto-Layout, das die frame.origin.y an einem bestimmten Punkt ändert (nicht sicher, wann genau, aber es tut, wenn die Container-Ansicht didMoveToWindow trifft). Weißt du zufällig, mit welcher Methode das Auto-Layout den Rahmen verändert? – Sethypie

5

Mit ReactiveCocoa ist so einfach wie:

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

zum Beispiel.

Verwandte Themen