हां, एक अलग स्थान प्रबंधक ऑब्जेक्ट होना संभव है और मैपव्यू (बीटीडब्लू, मैं बोरींग से एसओ कोड-फॉर्मेटर को रोकने के लिए सूची उपसर्ग के रूप में नीचे '=' का उपयोग कर रहा हूं)।
= आपके UIViewController
में दो अलग-अलग गुण बनाए रखें: एक MKMapView
और एक से CLLocationManager
पर।
= MKMapView
के साथ एक XIB फ़ाइल और किसी भी अन्य खिड़की क्रोम आप चाहते बनाएँ। आउटलेट को नियंत्रक प्रजातियों से कनेक्ट करें। सुनिश्चित करें कि MKMapView
उपयोगकर्ता स्थान का पालन नहीं करता है। विशेष रूप से locationManager:didUpdateToLocation:fromLocation:
विधि है जो जब भी कोई नया स्थान मूल्य उपलब्ध है बुलाया जाएगा -
= UIViewController CLLocationManagerDelegate
प्रोटोकॉल लागू है। हम नियंत्रक को स्थान प्रबंधक के प्रतिनिधि के रूप में सेट करेंगे।
= दृश्य में नियंत्रक की loadView
विधि, इसमें MKMapView
के साथ एनआईबी लोड करें। उपयोगकर्ता प्रतिक्रिया देने के लिए आप UIActivityIndicatorView
स्पिनर डाल सकते हैं और इसे startAnimating
पर सेट कर सकते हैं। तो फिर तुम के साथ शुरू:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];
= locationManager:didUpdateToLocation:fromLocation:
जांच में देखने के लिए कि घटना पिछले एन सेकंड के बाद से अपडेट किया गया।फिर स्थान प्रबंधक को अपडेट करना बंद करने के लिए, स्पिनर को एनिमेट करने से रोकने के लिए बताएं, और लेट/लम्बा डेटा प्राप्त करें और इसे दृश्य दृश्य और क्षेत्र के साथ मानचित्र दृश्य में असाइन करें ताकि यह सही जगह पर ज़ूम और केंद्र हो।
= अब यहाँ मुश्किल हिस्सा है: नीले संगमरमर 'throbber' MapView ट्रैकिंग उपयोगकर्ता स्थान की एक विशेषता है। वास्तविक क्षण में आने तक आपको क्षणिक रूप से 'नकली इसे' करना होगा (या वर्तमान स्थान के लिए एक अलग मार्कर का उपयोग करें और अपनी स्थिति को बनाए रखें)। व्यक्तिगत रूप से मैं नीले संगमरमर के साथ जाऊंगा जो उपयोगकर्ता परिचित है।
= इसे बनाने के लिए यह स्टार्टअप पर सही दिखाता है आपको स्थान प्रबंधक द्वारा लौटाए गए स्थान पर जोड़े गए नीले संगमरमर ग्राफिक के साथ एक कस्टम MKAnnotationView बनाने की आवश्यकता होगी। इसका अर्थ यह है कि मानचित्र के साथ मैपव्यू का स्नैपशॉट लेना, फिर नीली संगमरमर को फ़ोटोशॉप करना और कस्टम एनोटेशन व्यू के लिए छवि के रूप में इसका उपयोग करना।
= आप इसे सक्रिय रूप से नक्शे का पालन करना चाहते हैं, तो आप MapView की userlocation ट्रैकिंग सक्षम कर सकते हैं और जब यह वास्तविक डेटा हो जाता है, तो आप अपने पहले से निर्धारित मार्कर छिपाने के लिए और MapView अद्यतन करने करते हैं। दूसरा विकल्प मौजूदा स्थान प्रबंधक को हर सेकेंड या तो अपडेट प्राप्त करने की अनुमति देना है और नीली संगमरमर एनोटेशन की स्थिति को अपडेट करना है।
= MapView की अपनी userLocation अद्यतन करने viewDidLoad में जोड़ने के लिए करते हैं करने के लिए:
[self.map.userLocation addObserver:self
forKeyPath:@"location"
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location
= लागू observeValueForKeyPath
। यह कहा जाता है जब MapView के userlocation
की location
विशेषता एक मूल्य है हो जाता है:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([self.map isUserLocationVisible]) {
[self.locationManager stopUpdatingLocation];
self.ownBlueMarble.hidden = YES;
}
// The current location is in self.map.userLocation.coordinate
}
= वर्तमान स्थान दिखाने में वार्म अप देरी से बचने के लिए, मानचित्र और स्थान प्रबंधक यह इतना युक्त ViewController के लिए एक संदर्भ रखना दूर नहीं जाता है (यह एक मेमोरी हॉग का थोड़ा सा है, लेकिन अगर आप इसे छोड़ देते हैं तो आपको मैप व्यू टाइल्स लोड होने तक फिर से इंतजार करना होगा और जाने के लिए तैयार है)।
= viewWillLoad
में आप कस्टम bluemarble एनोटेशन में अंतिम ज्ञात स्थान सामान और यह दिखा सकते हैं। उपयोगकर्ता स्थान ट्रैकिंग को चालू/बंद करें और जब आपको अधिसूचना मिलती है तो वही छुपा-एन-एनोटेशन-शो-द-असली-संगमरमर चाल काम करेगी। मैपव्यू का अपना स्थान मैनेजर डेटा में आता है और जब आपके पास डेटा होता है, तो आप अपना एनोटेशन मार्कर गायब कर सकते हैं।
= आप व्यू कंट्रोलर की viewWillDisappear
विधि को कार्यान्वित करना चाहते हैं और मैन्युअल रूप से userLocation
मानचित्र मानचित्र पर ट्रैकिंग बंद कर सकते हैं ताकि अगली बार दृश्य को लाया जा सके। आप अंतिम ज्ञात userLocation
भी प्राप्त करना चाहते हैं और इसे अगले गेट-गो के लिए सहेजना चाहते हैं। इस तरह, आप viewWillAppear
विधि में सभी पोजिशनिंग मार्कर-जुगलिंग कर सकते हैं और जब तक आप इसके लिए तैयार न हों तब तक उपयोगकर्ता स्थान हस्तक्षेप के बारे में चिंता न करें।
शुभकामनाएं।
धन्यवाद रामिन। यह अपेक्षित समाधान नहीं है हालांकि मुझे लगता है कि यह निकटतम मौजूदा है। – jantimon
हां, अगर वे हमें प्रारंभिक मूल्य पर मैपव्यू पर उपयोगकर्ता स्थान सेट करने की अनुमति देते हैं तो यह बहुत आसान होता ... या बेहतर अभी भी मौजूदा CLLocationManager इंस्टेंस के उपयोग की बजाय अपने स्वयं के निर्माण की अनुमति देता है ... लेकिन दुर्भाग्यवश वे ' टी। – Ramin