2009-09-17 17 views
19

मेरा ऐप वर्तमान उपयोगकर्ता स्थिति (CoreLocation.framework) को जानता है। जैसे ही उपयोगकर्ता एक नया MapView खोलता है, उसका आईफोन फिर से चालू स्थिति की खोज शुरू कर देता है। क्या यह छोड़ना संभव है या mkMapView के लिए पहली उपयोगकर्ता स्थिति को बदलना संभव है?कैसे दिए गए उपयोगकर्ता स्थान के साथ MKMapView प्रारंभ करें?

संपादित करें:

यह MKMapView के ऊपर लिख और एक अन्य LocationManager उपयोग करने के लिए संभव है?

उत्तर

42

हां, एक अलग स्थान प्रबंधक ऑब्जेक्ट होना संभव है और मैपव्यू (बीटीडब्लू, मैं बोरींग से एसओ कोड-फॉर्मेटर को रोकने के लिए सूची उपसर्ग के रूप में नीचे '=' का उपयोग कर रहा हूं)।

= आपके 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 विधि में सभी पोजिशनिंग मार्कर-जुगलिंग कर सकते हैं और जब तक आप इसके लिए तैयार न हों तब तक उपयोगकर्ता स्थान हस्तक्षेप के बारे में चिंता न करें।

शुभकामनाएं।

+1

धन्यवाद रामिन। यह अपेक्षित समाधान नहीं है हालांकि मुझे लगता है कि यह निकटतम मौजूदा है। – jantimon

+0

हां, अगर वे हमें प्रारंभिक मूल्य पर मैपव्यू पर उपयोगकर्ता स्थान सेट करने की अनुमति देते हैं तो यह बहुत आसान होता ... या बेहतर अभी भी मौजूदा CLLocationManager इंस्टेंस के उपयोग की बजाय अपने स्वयं के निर्माण की अनुमति देता है ... लेकिन दुर्भाग्यवश वे ' टी। – Ramin

27

अपने नियंत्रक में:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    CLLocationCoordinate2D coord = {latitude: 37.423617, longitude: -122.220154}; 
    MKCoordinateSpan span = {latitudeDelta: 1, longitudeDelta: 1}; 
    MKCoordinateRegion region = {coord, span}; 
    [mapView setRegion:region]; 
} 

नक्शा प्रकट होता है कि पालो अल्टो के पास केंद्रित हो रहा है

+0

जो मुझे चाहिए वह नहीं है। मैं नीली स्थिति सूचक ("वर्तमान स्थान") की स्थिति बदलना चाहता हूं। – jantimon

+1

उपयोगकर्ता स्थान केवल पढ़ने योग्य संपत्ति है, मुझे संदेह है कि आप इसके बारे में कुछ कर सकते हैं। केवल कानूनी रास्ता है कि एप्पल प्रदान करता है नीले सूचक को निष्क्रिय और अपने खुद के, जो एक तरह से व्यर्थ – zakovyrya

+1

एक 500 मी x 500 मीटर क्षेत्र [MapView setRegion सेट है लिखने के लिए होगा: MKCoordinateRegionMakeWithDistance (CLLocationCoordinate2DMake (54.233498f, 1.99375f), 500, 500) ]; –

0

initialisation पर गलत पर showUserLocation संपत्ति सेट करके देखें और उसके बाद region पहले था मानचित्र दृश्य बहाल (आपको पिछले मानचित्र को नष्ट करने से पहले इसे स्पष्ट रूप से स्टोर करना होगा)।

इस जैसे आप चाहते हैं है?

+0

नहीं, यह क्षेत्र के बारे में नहीं है लेकिन स्थिति सूचक के बारे में – jantimon

0

आप, आप जोड़ सकते हैं जो कुछ भी अंक आप नक्शे करना चाहते हैं एक और स्थान प्रबंधक का उपयोग करें और जो कुछ अन्य तर्क आप चाहते हैं के माध्यम से उन्हें अद्यतन करने की आवश्यकता नहीं है।

मान लीजिए कि आप एक रिमोट कंट्रोल कार के लिए एक सॉकेट संबंध नहीं था, और यह कि कार पेलोड में जियो-स्थान जानकारी युक्त सॉकेट डेटा वापस भेज देते हैं। आप इसे पार्स कर सकते हैं, और वास्तविक समय में अपने मानचित्र पर थंबनेल के स्थान को अपडेट कर सकते हैं। इसके लिए "userLocation" संपत्ति की आवश्यकता नहीं है, लेकिन यदि आप चाहें तो आप इसे दिखा सकते हैं।

उपयोगकर्ता के स्थान केवल पढ़ने के लिए है, तो आप इसका इस्तेमाल करते हैं या नहीं कर सकते। इसका मतलब यह नहीं है कि आपको ऐसा करने के लिए किसी अन्य स्थान प्रबंधक की आवश्यकता हो सकती है। ऐसा लगता है कि आपके ऐप को वास्तव में उस सुविधा की आवश्यकता नहीं है, लेकिन मैं आपके प्रश्न को गलत समझ सकता हूं।

+0

बात यह है कि उपयोगकर्ता की स्थिति दिखाई नहीं दे रही है या यह पहले 10 सेकंड के लिए गलत दिखाया गया है, एक नया MKMapView दिखाया गया है। इन 10 सेकंड के बाद सबकुछ ठीक है। हालांकि, जैसा कि मुझे स्थिति पता है, मैं उन 10 सेकंड को छोड़ना पसंद करूंगा। – jantimon

+1

शायद पुराना है, लेकिन अगर कोई इसे पढ़ता है, तो आपको ऐप शुरू करते समय उपयोगकर्ता का स्थान प्राप्त करना चाहिए, जो उपयोगकर्ता को ढूंढने के लिए जीपीएस शुरू करेगा। इस तरह जब तक उपयोगकर्ता मानचित्र खोलता है, वह पहले से ही स्थित है। पीएस: यह 10 सेकंड के लिए बहुत सामान्य है, यहां तक ​​कि Google मानचित्र ऐप को स्थानांतरित करने के कुछ सेकंड बाद भी – renevdkooi