2012-05-29 12 views
8

जब उपयोगकर्ता ज़ूम करता है या नक्शे के चारों ओर स्क्रॉल करता है तो मैं लगातार एक एमके मैपव्यू के अनुसार अपना यूआई अपडेट करना चाहता हूं। (स्क्रॉलिंग समाप्त होने के बाद ही, यह ठीक काम करता है।)स्क्रॉलिंग/ज़ूमिंग करते समय MKMapView क्षेत्र को लगातार ट्रैक करना संभव है?

मैंने प्रतिनिधि विधि का प्रयास किया नक्शा दृश्य: क्षेत्रविल्लचेंजएनिमेटेड: जो, दस्तावेज़ीकरण के अनुसार, "जब भी वर्तमान में प्रदर्शित नक्शा क्षेत्र बदलता है, तब कॉल किया जाता है। स्क्रॉलिंग के दौरान, यह विधि मानचित्र की स्थिति में अपडेट की रिपोर्ट करने के लिए कई बार बुलाया जा सकता है। " http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    [self updateUIAcordingToMapViewRegionChange]; 
} 

लेकिन दुर्भाग्य से इस क्योंकि प्रलेखन सच कह करने के लिए नहीं लगता है काम नहीं करता। इस विधि को केवल क्षेत्र परिवर्तन की शुरुआत में ही बुलाया जाता है। स्क्रॉलिंग के दौरान, जबकि उंगली नीचे गिरती है और चारों ओर घूमती है, विधि को फिर कभी नहीं कहा जाता है।

इस समस्या को मैं मिल सकता है के बारे में केवल पोस्ट MacRumors सदस्य namanhams द्वारा किया गया था: http://forums.macrumors.com/showthread.php?t=1225172 लेकिन कोई भी किसी भी विचार के साथ आया था ...

एक समाधान मैं regionWillChange में एक टाइमर की स्थापना की कोशिश की के रूप में (और अमान्य यह क्षेत्रडिड चेंज में):

- (void)handleRegionChange:(NSTimer*)timer 
{ 
    [self updateUIAcordingToMapViewRegionChange]; 
} 

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    self.mapRegionIsChangingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 
                target:self 
                selector:@selector(handleRegionChange:) 
                userInfo:nil 
                repeats:YES]; 
} 

लेकिन यह भी काम नहीं करता है। स्क्रॉलिंग समाप्त हो जाने के बाद टाइमर से सभी विधि कॉल एक ही बार में निष्पादित की जाती हैं। MapView मुख्य थ्रेड या कुछ और ब्लॉक कर रहा है स्क्रॉल की तरह लगता है ...

मैं भी stackoverflow पर इस पोस्ट को पढ़ने, लेकिन दुर्भाग्य से पूरी तरह से यह समझ में नहीं आया: Monitor MKMapView redraw events तो अगर मेरी समस्या का हल वास्तव में उस में निहित है तो है- धागा, कृपया मुझे बताओ, और मैं इसके विवरण में खोदने की कोशिश करता हूं।

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

धन्यवाद!

उत्तर

9

यह काम करेगा:

@interface MapViewController() { 
    NSTimer *_updateUITimer; 
} 

@end 

@implementation MapViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _updateUITimer = [NSTimer timerWithTimeInterval:0.1 
              target:self 
              selector:@selector(updateUI) 
              userInfo:nil 
              repeats:YES]; 

    [[NSRunLoop mainRunLoop] addTimer:_updateUITimer forMode:NSRunLoopCommonModes]; 

} 

- (void)dealloc 
{ 
    [_updateUITimer invalidate]; 
} 

- (void)updateUI 
{ 
    // Update UI 
} 

@end 

एक और तरीका है MapView में टाइमर पैदा कर रही है: regionWillChangeAnimated और MapView में यह अमान्य: regionDidChangeAnimated।

+1

धन्यवाद! मैंने सोचा कि यह वही था जो मैंने स्वयं की कोशिश की थी (उपरोक्त दूसरा कोड स्निपेट देखें)। मैंने जो किया वह गलत था: मैंने टाइमर को किसी संपत्ति में संग्रहीत किया, लेकिन मेरे कोड स्निपेट के विपरीत (जिसे मैंने 'इसे छोटा और स्पष्ट' बनाने के लिए बदल दिया) मैं इसे केवल गेटटर में बना रहा था अगर इंस्टेंस वैरिएबल शून्य नहीं था। लेकिन टाइमर को अमान्य करने से संपत्ति को शून्य पर सेट नहीं किया जाता है, इसलिए मुझे लगता है कि मैं हमेशा रनअलॉप में पुराना अमान्य टाइमर जोड़ रहा था जब मेरे मानचित्र दृश्य ने क्षेत्र बदल दिया ... – Goodsquirrel

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