2013-07-31 4 views
11

मैं एक UIView के फ्रेम की उत्पत्ति के बदलते मूल्य पर नजर रखने और प्रतिक्रिया करने की कोशिश कर रहा हूं। मेरे कोड:आईओएस: पर्यवेक्षक को 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); 
} 

मुझे लगता है कि मुझे समझ नहीं आता निम्न त्रुटि संदेश हो रही है:

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" पर सेट करता हूं तो संकलित भी नहीं होगा।

अगर मैं केवल "फ्रेम" के लिए कीपैथ सेट करता हूं, तो कोई त्रुटि नहीं होती है लेकिन विधि का निरीक्षण होता है ValueForKeyPath कभी नहीं बुलाया जाता है। मुझे लगता है कि फ्रेम की उत्पत्ति में बदलाव फ्रेम में बदलाव के रूप में नहीं गिना जाता है ..?

मैं UIView के फ्रेम.ऑरिगिन.ई में पर्यवेक्षक को कैसे जोड़ूं?

+0

आप अपने 'पर्यवेक्षक ValueForKeyPath:' में सुपर कॉल नहीं करते हैं। – Andy

उत्तर

11

हालांकि मैं जिस तरह से है कि मैं शुरू में चाहता था में वास्तव में मेरी समस्या का समाधान नहीं कर सकता है, मुझे लगता है कि मुझे पता चला है UIView के केंद्र में पर्यवेक्षकों को सही ढंग से जोड़ने में सक्षम हूं। मेरे विचार के केंद्र की निगरानी करके मैं यह निर्धारित कर सकता हूं कि फ्रेम की उत्पत्ति बदल गई है।

[RACObserve(self.view, frame) subscribeNext:^(NSNumber *rect) { 
     NSLog(@"position y: %f", rect.CGRectValue.origin.y); 
    }]; 
उदाहरण के लिए

:

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

धन्यवाद! इससे मेरी समस्या ठीक हो गई! –

2

मुझे नहीं लगता कि यह संभव है कि फ्रेम के केवल वाई मान को देखें। लेकिन फ्रेम संपत्ति को देख के बजाय आप setFrame के ऊपर लिख सकता है: विधि

इस तरह

:

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

सुझाव के लिए धन्यवाद। मैंने कोशिश की लेकिन इस विधि को बुलाया नहीं जा रहा है। बात यह है कि, मैं ऑटोलायआउट का उपयोग कर रहा हूं जो कुछ बिंदु पर frame.origin.y को संशोधित करता है (निश्चित रूप से बिल्कुल सही नहीं है, लेकिन जब तक कंटेनर दृश्य हिट करता है तब तक MoveToWindow)। क्या आपको पता है कि फ्रेम को संशोधित करने के लिए ऑटोलायआउट किस विधि का उपयोग करता है? – Sethypie

संबंधित मुद्दे