2013-07-31 11 views
11

Próbuję monitorować i reagować na zmieniającą się wartość początku ramki UIView. Mój kod:iOS: Dodawanie obserwatora do ramki UIView.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); 
} 

Dostaję następujący komunikat o błędzie, że nie rozumiem:

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

Naprawdę, jestem zainteresowany tylko w pozycji y pochodzenia ale kod nawet nie skompiluje się, jeśli ustawię keyPath na "frame.origin.y".

Jeśli ustawię dla parametru keyPath po prostu "frame", nie ma błędów, ale metoda observeValueForKeyPath nigdy nie zostanie wywołana. Domyślam się, że zmiana w pochodzeniu ramki nie liczy się jako zmiana w klatce ...?

Jak mogę dodać obserwatora do ramki UIView.origin.y?

+0

Nie wywołujesz super w swojej "observerValueForKeyPath:". – Andy

Odpowiedz

11

Chociaż nie mogę rozwiązać mój problem dokładnie w taki sposób, że początkowo chciał, I okazało się, że jestem w stanie prawidłowo dodać obserwatorów do centrum UIView. Monitorując środek mojego widoku, mogę stwierdzić, że zmieniło się położenie ramki.

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

dzięki! to pomogło naprawić mój problem! –

2

Nie sądzę, że możliwe jest obserwowanie tylko wartości y ramki. Ale zamiast obserwowania właściwość ramki można zastąpić setFrame: Metoda

tak:

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

Dzięki za sugestię. Wypróbowałem to, ale ta metoda nie wydaje się być wywoływana. Chodzi o to, że używam autolayout, który modyfikuje frame.origin.y w pewnym momencie (nie jestem pewien kiedy dokładnie, ale robi się to do czasu, gdy widok kontenera trafi didMoveToWindow). Czy wiesz, która metoda autolayout używa do modyfikowania ramki? – Sethypie

5

z ReactiveCocoa jest proste:

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

na przykład.

Powiązane problemy