2009-09-05 28 views
15

बचाया शो मैं उपयोगकर्ता चूक में नक्शा क्षेत्र बचत हूँ जब मेरे iPhone ऐप्लिकेशन इस तरह बंद हो रहा है:MKMapView गलत तरीके से क्षेत्र

MKCoordinateRegion region = mapView.region; 
[[NSUserDefaults standardUserDefaults] setDouble:region.center.latitude forKey:@"map.location.center.latitude"]; 
[[NSUserDefaults standardUserDefaults] setDouble:region.center.longitude forKey:@"map.location.center.longitude"]; 
[[NSUserDefaults standardUserDefaults] setDouble:region.span.latitudeDelta forKey:@"map.location.span.latitude"]; 
[[NSUserDefaults standardUserDefaults] setDouble:region.span.longitudeDelta forKey:@"map.location.span.longitude"]; 

एप्लिकेशन फिर से लॉन्च किया गया, Ш पढ़ उन मूल्यों को उसी तरह वापस, ताकि उपयोगकर्ता ठीक उसी मानचित्र दृश्य के रूप में यह आखिरी बार था देख सकते हैं:

MKCoordinateRegion region; 

region.center.latitude = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.latitude"]; 
region.center.longitude = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.longitude"]; 
region.span.latitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"]; 
region.span.longitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"]; 

NSLog([NSString stringWithFormat:@"Region read : %f %f %f %f", region.center.latitude, region.center.longitude, region.span.latitudeDelta, region.span.longitudeDelta]); 

[mapView setRegion:region]; 

NSLog([NSString stringWithFormat:@"Region on map: %f %f %f %f", mapView.region.center.latitude, mapView.region.center.longitude, mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta]); 

क्षेत्र मैं उपयोगकर्ता चूक से पढ़ा है (नहीं आश्चर्य की बात) जब यह बचा लिया गया था के रूप में बिल्कुल वैसा ही। ध्यान दें कि बचाया गया है सीधे नक्शे से आता है, इसलिए यह किसी भी तरह से परिवर्तित नहीं होता है। मैंने इसे setRegion: विधि के साथ मानचित्र पर वापस सेट किया है, लेकिन फिर यह अलग है!

उदाहरण परिणाम:

Region read : 50.241110 8.891555 0.035683 0.042915<br> 
Region on map: 50.241057 8.891544 0.050499 0.054932 

किसी को भी पता है कि ऐसा क्यों होता?

+0

मुझे आपकी इच्छित नक्शा क्षेत्र को प्राप्त करने का एक समाधान मिला: http://stackoverflow.com/questions/3612007/mkmapview-setregion-snaps-to-predefined-zoom-levels/7935 – AlexWien

उत्तर

2

मुझे एक ही समस्या थी। यह बहुत निराशाजनक है। ऐसा लगता है कि MATMapView के लिए दस्तावेज़ डेटाटाइप के संबंध में कुछ क्षेत्रों में गलत है।

आप के रूप में (डबल) क्षेत्र पैरामीटर सेट करते है तो आपको त्रुटि आ रही हैं मिलेगा। हालांकि यदि क्षेत्र पैरामीटर पारित होते हैं (फ्लोट) तो आपको सही व्यवहार मिल जाएगा।

तो

MKCoordinateRegion region = {{0.0f,0.0f},{0.0f,0.0f}}; 

region.center.latitude = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.latitude"]; 
region.center.longitude = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.longitude"]; 
region.span.latitudeDelta = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"]; 
region.span.longitudeDelta = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"]; 

mapView.region = region; 
+0

पर मेरी पोस्ट देखें आपका उत्तर। मैंने अपनी समस्या को हल करने की कोशिश की है, लेकिन अभी भी कोई भाग्य नहीं है ... मुझे पूरा यकीन है कि समस्या दोहरी फ्लोट करने के लिए छंटनी है, लेकिन अब इसे ठीक करने का कोई तरीका नहीं है। कोई और कृपया? –

0

मैं सत्यापित नहीं कर सकता है कि इस काम करता है की कोशिश करो। क्या कोई और ऐसा कर सकता है? मैं यह शर्त लगाने के लिए तैयार हूं कि आप जो देख रहे हैं वह आपके युगल के फ्लोट में छंटनी का प्रभाव है। कुछ मामलों में, जब यह मेरे साथ होता है, तो मैंने पाया है कि मैं 0.999 9 तक अवधि को गुणा कर सकता हूं और क्षेत्र को रीसेट कर सकता हूं, और फिर यह वही होगा जो मैं चाहता हूं। लेकिन सभी क्षेत्रों में नहीं - कभी-कभी यह बहुत अलग होता है, 20% तक, खासकर छोटे स्पैन के लिए।

+0

er, क्षमा करें - यह नीचे दी गई टिप्पणी से संबंधित है: "मुझे एक ही समस्या थी। यह बहुत निराशाजनक है ..." – Colin

8

यहाँ मुद्दा है जब आप क्षेत्र निर्धारित करते हैं, मानचित्र ज़ूम स्तर "तस्वीरें" निकटतम जूम सीमा के बाहर है। (मुझे संदेह है कि ये ज़ूम थ्रेसहोल्ड ज़ूम की मात्रा हैं जब आप डबल-टैप या दो-उंगली-टैप करते हैं)

तो यदि नक्शा उदाहरण के लिए ज़ूम स्तर 1 दिखा रहा है, और आप उस क्षेत्र को उसी अवधि में सेट करते हैं इस प्रकार मूल्य: region = [mapView region]; [mapView setRegion:region]; यह निकटतम ज़ूम स्तर स्तर 1, यानी स्तर 2 से बाहर "स्नैप" करेगा, और आप दो के कारक के बारे में ज़ूम आउट करेंगे।

मूल पोस्टर के लिए वर्कअराउंड क्षेत्र को सेट करने से पहले स्पैन मानों को कम करने के लिए है, ताकि जब दृश्य बाहर निकल जाए, तो यह ऊपर के ऊपर नहीं, ज़ूम स्तर पर निकलता है।

उदा

region.span.latitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"] * 0.999;

region.span.longitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"] * 0.999;

उपयोगकर्ता डबल नल के साथ जूम करने गया था तो (और इसलिए सीमा को सीमा से कूद) इस काम करता है बहुत अच्छी तरह से, उन्हें एक ही दृश्य की ओर लौटने लगभग ठीक।

लेकिन अगर वे पिंच-ज़ूम और देखने आधे रास्ते के बीच ज़ूम थ्रेसहोल्ड यह अभी भी अगले स्तर तक बाहर स्नैप हो जाएगा है। उस मामले में इतना अच्छा नहीं है लेकिन अभी तक कोई फिक्स नहीं है।

इसके लिए ऐप्पल रडार पर खुली बग हैं, उम्मीद है कि यह भविष्य की रिलीज में तय की जाएगी।

+0

यह एक बग नहीं है। यह अच्छी तरह से प्रलेखित है और दस्तावेज के रूप में बिल्कुल व्यवहार करता है।https://developer.apple.com/library/iOS/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html – Frizlab

+0

@frizlab लिंक मर चुका है जो यह इंगित कर रहा था? – 3366784

+0

@ 3366784 https://developer.apple.com/documentation/mapkit/mkmapview। वैसे भी टिप्पणी पुरानी है, अब 'MKMapView' अपेक्षा के अनुसार काम करता है। – Frizlab

2

ठीक है, इसलिए मैं कुछ समय से इस मुद्दे के साथ संघर्ष कर रहा हूं और मुझे लगता है कि मैं क्रुफ्टी के सिद्धांत (MKMapView show incorrectly saved region) से प्रेरित एक प्रभावी कामकाज के साथ आया हूं। असल में, यदि आप मानचित्र दृश्य क्षेत्र को अपने NSUserDefaults से प्राप्त मानों के साथ सेट करते हैं, तो मैप व्यू ने अपना प्रारंभिक लोड ("स्नैप आउट" व्यवहार के साथ पूरा किया है) के बाद, नक्शा क्षेत्र वह होगा जो आप उम्मीद करेंगे । यह चाल आपके आवेदन कोड में एक हुक ढूंढने के लिए मानचित्र दृश्य से कहीं नीचे की ओर शुरू हो रही है। सुंदर नहीं है, लेकिन यह मेरे लिए पूरी तरह से काम करता है। अंतर्दृष्टि के लिए क्रुफ्टी के लिए धन्यवाद।

0

मुझे 0.999 के बजाय 0.9 के गुणात्मक कारक का उपयोग करके अधिक सफलता मिली है, फिर भी कभी-कभी कभी-कभी धक्का लगती है लेकिन वांछित ज़ूम के करीब गले लगती है। अभी भी यह कहने के लिए कि मैं इसे हराता हूं, इस मुद्दे को हल करना अच्छा लगेगा! haha

-1

आप InterfaceBuilder में MapView सेट करते हैं, सुनिश्चित करें कि आप ऐसा नहीं करते हैं बनाने:

_mapView = [[MKMapView alloc] init]; 

जैसे ही मैंने इस init लाइन हटा दिया, मेरे मानचित्र दृश्य अचानक सभी अद्यतन करने के लिए ठीक से जवाब शुरू किया मैं इसे भेजा। मुझे संदेह है कि क्या होता है कि यदि आप आवंटन करते हैं, तो यह वास्तव में एक और दृश्य बना रहा है जिसे कहीं भी नहीं दिखाया जा रहा है। स्क्रीन पर जो भी आप देखते हैं वह आपके निब द्वारा शुरू किया जाता है। लेकिन अगर आप एक नया प्रवेश करते हैं, तो यह कहीं और कुछ है और यह कुछ भी करने वाला नहीं है।

0

self.lastCameraAtitude = self.mapView.camera.altitude; 

की तरह रवैया स्टोर करने के लिए भी प्रयास करें और जब यू अपने नक्शे

[self.mapView.camera setAltitude:self.lastCameraAtitude]; 

कॉन्फ़िगर यह एक ही क्षेत्र में एक ही कैमरे के लिए सेट हो जाएगा। आपके मामले में आप केवल क्षेत्र सेट करते हैं लेकिन कैमरा नहीं।

0

यहाँ एक स्विफ्ट एक्सटेंशन ठीक से सांकेतिक शब्दों में बदलना और MKCoordinateRegion डिकोड करने के लिए है:

// Save 
NSUserDefaults.standardUserDefaults().setObject(mapView.region.encode, forKey: "mapRegion01") 

// Restore 
if let dict = NSUserDefaults.standardUserDefaults().dictionaryForKey("mapRegion01"), 
    let myRegion = MKCoordinateRegion(decode: dict) { 

    // do something with myRegion 
} 
0

हाल ही में मैं एक ही बात मारा:

extension MKCoordinateRegion { 

    var encode:[String: AnyObject] { 
     return ["center": 
        ["latitude": self.center.latitude, 
        "longitude": self.center.longitude], 
       "span": 
        ["latitudeDelta": self.span.latitudeDelta, 
        "longitudeDelta": self.span.longitudeDelta]] 
    } 

    init?(decode: [String: AnyObject]) { 

     guard let center = decode["center"] as? [String: AnyObject], 
      let latitude = center["latitude"] as? Double, 
      let longitude = center["longitude"] as? Double, 
      let span = decode["span"] as? [String: AnyObject], 
      let latitudeDelta = span["latitudeDelta"] as? Double, 
      let longitudeDelta = span["longitudeDelta"] as? Double 
     else { return nil } 


     self.center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
     self.span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta) 
    } 
} 

यह है कि यह कैसे उपयोग करने के लिए है। पहले जवाब से मिली जानकारी का उपयोग करना, निम्नलिखित तेज 4 कार्यान्वयन मेरे लिए काम करता है:

override func viewWillAppear(_ animated: Bool) { 
    if isMovingToParentViewController { 
     setInitialRegion() 
     DispatchQueue.main.asyncAfter(deadline: .now(), execute: { 
      self.setInitialRegion() 
     }) 
    } 
} 

यह एक प्रारंभिक जूम क्षेत्र सेट किए जाने पर मानचित्र दृश्य नियंत्रक दृश्य में धकेल दिया है। SetInitialRegion सेट करने के लिए सिंक्रोनस कॉल ज़ूम स्तर पर स्नैप किए गए क्षेत्र को सेट करेगा। SetInitialRegion सेट करने के लिए एसिंक्रोनस कॉल सटीक क्षेत्र सेट करेगा। ज़ूम कलाकृतियों को हटाने के लिए सिंक्रोनस कॉल अभी भी आवश्यक है।

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