2010-05-19 10 views
8

से काम नहीं कर रहा मुझे लगता है कि मुझे यह पता होना चाहिए, लेकिन मुझे अब घंटों तक स्टंप कर दिया गया है और मैं विचारों से बाहर हो गया हूं।प्रदर्शन चयनकर्ता: withObject: afterDelay: scrollViewDidZoom

सिद्धांत सरल है, उपयोगकर्ता एक चुटकी का उपयोग कर स्क्रॉलव्यू में ज़ूम और पोजिशनिंग का उपयोग करता है। यदि वे थोड़े समय के लिए चुटकी पकड़ते हैं तो स्क्रॉलव्यू ज़ूम स्तर और सामग्री ऑफ़सेट रिकॉर्ड करता है।

तो मैंने सोचा कि मैं एक प्रदर्शन शुरू कर दूंगा: ऑब्जेक्ट: scrollDiewDidZoom प्रतिनिधि विधि पर डेले के साथ। यदि यह समाप्त हो जाता है तो मैं सेटिंग्स रिकॉर्ड करता हूं। मैं प्रत्येक बार scrollViewDidZoom कहलाता है और चुटकी इशारा खत्म होने पर निर्धारित कॉल को हटा देता है।

2010-05-19 22: 43: ०१.९३१ को रीसेट टाइमर
2010-05-19 22: 43:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{ 
    NSLog(@"resetting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 

    [self performSelector:@selector(positionLock) withObject:nil afterDelay:0.4];    
} 

-(void)positionLock{ 
    NSLog(@"position locked "); 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{ 

    NSLog(@"deleting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 
} 

यह आउटपुट है:

यह है कि मैं क्या है ०१.९६४ 43:: ०२.२३१ को रीसेट टाइमर
2010-05-19 22: 43: ०२.२५३ को रीसेट टाइमर
2010-05-19 22: 43: ०२.२६९ टाइमर
को रीसेट टाइमर
2010-05-19 22 को रीसेट 63,210 2010-05-19 22: 43: ०२.२९८ को रीसेट टाइमर
2010-05-19 22: 43: ०५.३९९ टाइमर

को हटाने आप पिछले और दूसरा पिछले घटनाओं के बीच देरी देख सकते हैं पर्याप्त से अधिक होना चाहिए विलंबित चयनकर्ता निष्पादित करने के लिए कॉल करें।

अगर मैं performSelector बदल देते हैं: withObject: सादे पुराने performSelector साथ withDelay:

2010-05-19 23: 08: 30.333 रीसेट करने टाइमर
2010-05-19 23: 08: 30.333 स्थिति मैं इस मिल 08: 30.366 टाइमर
2010-05-19 23 को रीसेट: 08: 30.367 स्थिति बंद कर दिया
2010-05-19 23: 08: 30.688 टाइमर

कौन सा isn को हटाने '
2010-05-19 23 बंद कर दिया टी जो मैं चाहता हूं लेकिन यह दिखाने के लिए कार्य करता है कि यह केवल देरी है जो इसे func नहीं कर रहा है शेर, चयनकर्ता के साथ कुछ नहीं करना है जो हेडर में घोषित नहीं किया जा रहा है, मिस्पेल्ट या किसी अन्य कारण से।

कोई विचार यह क्यों काम नहीं कर रहा है?

उत्तर

19

मुझे लगता है कि ट्रैकिंग के दौरान टाइमर घटनाओं को अनदेखा किया जाता है (जब स्क्रॉल या ज़ूम करने के लिए एक उंगली नीचे होती है)। आपको चयनकर्ता को एक अलग मोड में करना पड़ सकता है ([NSObject performSelector:withObject:afterDelay:inModes:] देखें)। विशेष रूप से, मोड के लिए स्थिर NSRunLoopCommonModes का उपयोग करने का प्रयास करें।

+0

ऐसा लगता है कि आपको एक बिंदु मिल गया है। मुझे आश्चर्य है कि उन घटनाओं को क्यों नजरअंदाज कर दिया जाता है। क्या यह एक डिजाइन पसंद है? क्या इसके बारे में कोई दस्तावेज है? – erkanyildiz

+0

आप बिल्कुल सही हैं। वह मुझे पागल कर रहा है ..! –

3

बस पर क्या ब्रायन ने कहा कि जोड़ने के लिए - यहाँ अपने जवाब के अपने कार्यान्वयन है: - inModes: मोड की एक सरणी लेता

[self performSelector:@selector(callMethod) withObject:0 afterDelay:1.0 inModes:@[NSRunLoopCommonModes]]; 

नोट।

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

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