2013-07-31 34 views
11

Tôi đang cố gắng theo dõi và phản ứng với giá trị thay đổi của nguồn gốc của khung của UIView. Mã của tôi:iOS: Thêm người quan sát vào frame.origin.y của 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); 
} 

Tôi nhận được thông báo lỗi sau mà tôi không hiểu:

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

Thực sự, tôi chỉ quan tâm đến vị trí y về nguồn gốc nhưng mã thậm chí sẽ không biên dịch nếu tôi đặt keyPath thành "frame.origin.y".

Nếu tôi đặt keyPath thành "khung" đơn giản, không có lỗi nhưng phương thức observValueForKeyPath không bao giờ được gọi. Tôi đoán thay đổi về nguồn gốc của khung hình không được tính là thay đổi đối với khung hình ..?

Làm cách nào để hoàn thành việc thêm người quan sát vào frame.origin.y của UIView?

+0

Bạn không gọi siêu trong 'observerValueForKeyPath:'. – Andy

Trả lời

11

Mặc dù tôi không thể giải quyết vấn đề của tôi chính xác theo cách mà tôi ban đầu muốn, tôi đã phát hiện ra rằng tôi có thể thêm người quan sát một cách chính xác vào trung tâm của UIView. Bằng cách giám sát tâm điểm của tôi, tôi có thể xác định rằng nguồn gốc của khung hình đã thay đổi.

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

cảm ơn! điều này đã giúp khắc phục sự cố của tôi! –

2

Tôi không nghĩ rằng chỉ có thể quan sát giá trị y của khung. Nhưng thay vì quan sát thuộc tính khung bạn có thể ghi đè lên setFrame: Phương pháp

Như thế này:

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

Cảm ơn bạn đã đề xuất. Tôi đã thử nó nhưng phương pháp này dường như không được gọi. Vấn đề là, tôi đang sử dụng autolayout mà sửa đổi frame.origin.y tại một số điểm (không chắc chắn khi chính xác, nhưng nó hiện tại thời gian xem các lần truy cập container didMoveToWindow). Bạn có biết rằng phương thức autolayout sử dụng để sửa đổi khung không? – Sethypie

5

Với ReactiveCocoa cũng đơn giản như:

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

ví dụ.

Các vấn đề liên quan