2012-10-19 6 views
11

जब कोई एनोटेशन चुना गया है तो कोई उपयोगकर्ता सहेजने पर मैपव्यू के थंबनेल को सहेजने का प्रयास कर रहा हूं। समस्या तब होती है जब उपयोगकर्ता ने उस एनोटेशन पर अभी तक ज़ूम नहीं किया है, इसलिए बंद ज़ूम स्तर लोड नहीं किया गया है।MKMapView का उपयोग कैसे करें लोडिंग प्रतिनिधि, संभावित "समाप्त प्रदर्शन" प्रतिनिधि समाप्त हो गया?

यह मैं उपयोगकर्ता नल के बाद क्या कर रहा है को बचाने:

  1. सच
  2. केंद्र के लिए एक bool "बचत" सेट और एनोटेशन पर ज़ूम (एनिमेशन)
  3. जब mapViewDidFinishLoadingMap प्रतिनिधि विधि को कॉल किया जाता है, और यदि बचत सही है:
  4. दृश्य से बाहर UIImage बनाएं, और इसे सहेजें। मोडल व्यू खारिज करें।

लेकिन जब छवि सहेजा जाता है, और देखने लोड हो रहा है वास्तव में समाप्त नहीं किया है को बचाया, के रूप में मैं अभी भी ग्रिडलाइनें के साथ एक उतार नक्शे को देखने के परिणाम छवि को खारिज कर दिया है जिन्हें आप नीचे देख:

Gridlines unfinished

मेरा सवाल यह है कि, मैं यह थंबनेल सहेजने से पहले मानचित्र को लोड करना समाप्त कर रहा हूं और प्रदर्शित करना कैसे समाप्त कर सकता हूं?

+0

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

उत्तर

15

अद्यतन: आईओएस 7 में new delegate है जो इस समस्या को हल कर सकता है। मैंने अभी तक एक तरह से या दूसरे की पुष्टि नहीं की है।

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 

पूर्व iOS6 समर्थन:

mapViewDidFinishLoadingMap: unreliable प्रतीत होता है। मुझे लगता है कि इसे कभी-कभी नहीं कहा जाता है, खासकर अगर नक्शा टाइल्स पहले से ही कैश किए जाते हैं, और कभी-कभी इसे कई बार कहा जाता है।

मुझे लगता है कि जब इसे कई बार कहा जाता है तो अंतिम कॉल सही ढंग से प्रस्तुत किया जाएगा। इसलिए मुझे लगता है कि यदि आप उपयोगकर्ता को सहेजने के बाद 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)userClickedSave 
{ 
    assert(self.saving == NO); 
    if (self.saving == NO) { 
     self.saving = YES; 
     assert(self.finishLoadingTimer == nil); 
     self.view.userInteractionEnabled = NO; 
     [self restartTimer]; 
    } 
} 

- (void)mapLoadingIsFinished 
{ 
    self.finishLoadingTimer = nil; 
    [self doSnapshotSequence]; 
    self.saving = NO; 
    self.view.userInteractionEnabled = YES; 
} 

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

उपरोक्त कोड MapLoadingIsFinished को कॉल करेगा: उपयोगकर्ता को सहेजने के दौरान केवल दो बार विधि और नक्शा ViewDidFinishLoadingMap: विधि, यदि बचत हो रही है .. लेकिन उस प्रश्न में, उन्होंने उल्लेख किया "वह अभी भी एक अनलोड किए गए मानचित्र को देखता है mapViewDidFinishLoadingMap के बाद भी ग्रिडलाइन: "मुझे नहीं लगता कि यह –

+0

@RA जैसा भी होगा, जैसा कि मैंने उपरोक्त उल्लेख किया है, मैपलोडिंग IsFinished को कई बार कहा जाता है और आखिरी बार इसे विश्वसनीय माना जाता है। यह कोड इसका लाभ उठाता है। कोड को आज़माएं और अगर आपको कोई समस्या दिखाई दे तो मुझे बताएं। – Skotch

0

क्या आप सुनिश्चित हैं कि वह क्षेत्र जहां आप स्क्रीनशॉट ले रहे हैं, ज़ूम स्तर समर्थित है जिसे आप आवेदन कर रहे हैं। उदाहरण के लिए, यूएस ज़ूम स्तर समर्थन में अधिक है, आप अधिकतम विवरण में ज़ूम इन कर सकते हैं, जबकि एशिया में उच्च ज़ूम स्तर हो सकता है, समर्थित नहीं हो सकता है।

5

तो iOS7 के लिए विकसित करने के लिए सबसे अच्छा प्रतिनिधि का उपयोग करने के लिए है: mapViewDidFinishRenderingMap: fullyRendered:

mapViewDidFinishRenderingMap:fullyRendered