2012-07-30 13 views
7

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView को तब तक नहीं कहा जाता है जब टाइल्स कैश से लोड होते हैं, क्या यह जानने का कोई तरीका है कि सभी टाइल्स लोड किए गए हैं (या तो कैश से या मैपिंग सर्वर से) और प्रदर्शित?पता लगाना जब MapView टाइल्स प्रदर्शित होते हैं

क्या कोई प्रतिनिधिमंडल है जो बताता है कि टाइल्स लोड हो चुके हैं?

+2

मैं दायर की है एप्पल बग # 13,774,496 इस से संबंधित है और दिखाने के लिए समस्या अभी भी iOS6 पर मौजूद है एक उदाहरण एप्लिकेशन बनाया: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed

उत्तर

4

यहाँ कुछ स्रोत कोड मैंने लिखा है:https://github.com/jonathanlking/mapViewTest

आप इस तरह समस्या के बारे में क्यों नहीं लगता कि;

जब नक्शा दृश्य बदल जाएगा, mapView:regionDidChangeAnimated: कहा जाएगा।

वहां से mapViewWillStartLoadingMap: कहा जाएगा।

अगला mapViewDidFailLoadingMap:withError: या mapViewDidFinishLoadingMap: कॉल किया जाएगा यदि टाइल्स सर्वर से प्राप्त किए गए हैं।

हालांकि अगर न तो कहा जाता है, तो आप मान सकते हैं कि टाइल्स कैश से लोड किए जा रहे हैं।

+2

धन्यवाद, लेकिन अभी भी करने के लिए कोई रास्ता नहीं है पता है कि वे कब प्रदर्शित होते हैं। –

+0

वे तत्काल प्रदर्शित होते हैं - क्योंकि वे कैश किए जाते हैं। –

+2

क्षमा करें, लेकिन यह काम नहीं करता है। मैंने अपने आईपॉड टच पर इंटरनेट कनेक्शन हटा दिया और उस स्तर पर ज़ूम किया जहां कोई कैश किए गए टाइल्स नहीं थे और यह अभी भी बताता है कि नक्शा सफलतापूर्वक लोड हो रहा है (आपके उदाहरण में कैश से)। यह ऐप्पल के हिस्से पर एक बग है। – iwasrobbed

2

जैसा कि बताया गया है, mapViewDidFinishLoadingMap कभी-कभी बिल्कुल नहीं कहा जाता है, खासकर यदि नक्शा टाइल्स पहले से ही कैश किए जाते हैं, और कभी-कभी इसे कई बार कहा जाता है।

मुझे पता है कि अंतिम कॉल पर इसे कई बार कहा जाता है जब सभी टाइल्स प्रदान किए जाते हैं। इसलिए मुझे लगता है कि यदि आप मानचित्र शुरू होने के बाद 2 सेकंड टाइमर सेट करते हैं तो आप इसे काम पर ला सकते हैं। इंटरैक्शन अक्षम करें ताकि नक्शा बदलना जारी न रहे, और टाइमर बंद होने पर उपयोगकर्ता इंटरैक्शन सक्षम कर सके।

यदि mapViewDidFinishLoadingMap को भविष्य में 2 सेकंड के लिए फिर से टाइमर रीसेट करने के लिए कहा जाता है। जब टाइमर अंततः बंद हो जाता है, तो आपके पास पूरी तरह से प्रस्तुत नक्शा होना चाहिए।

आप अन्य कॉलबैक जैसे mapViewDidFailLoadingMap पर विचार करना चाहेंगे। इसके अलावा शोर कनेक्शन पर इसका परीक्षण करें, क्योंकि टाइल्स लाने के लिए काफी समय लगता है, तो 2 सेकंड लंबे समय तक पर्याप्त नहीं हो सकते हैं।

- (void)restartTimer 
{ 
    [self.finishLoadingTimer invalidate]; 
    self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                   target:self 
                  selector:@selector(mapLoadingIsFinished) 
                  userInfo:nil 
                   repeats:NO]; 
} 

- (void)mapLoadingIsFinished 
{ 
    self.finishLoadingTimer = nil; 
    self.mapChanging = NO; 
    self.view.userInteractionEnabled = YES; 
} 

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    if (self.mapChanging) { 
     [self restartTimer]; 
    } 
} 

- (void)startLookingForMapChange 
{ 
    assert(self.mapChanging == NO); 
    if (self.mapChanging == NO) { 
     self.mapChanging = YES; 
     assert(self.finishLoadingTimer == nil); 
     self.view.userInteractionEnabled = NO; 
     [self restartTimer]; 
    } 
} 
+0

यह उस परिदृश्य के लिए काम नहीं करता है जहां आपने इंटरनेट कनेक्शन खो दिया है, इसलिए यह अधिक टाइल्स लोड नहीं कर सकता है। यह अभी भी प्रतिनिधि को यह कहते हुए कहते हैं कि नक्शा पूरी तरह से लोड हो गया है। – iwasrobbed

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