2011-02-17 14 views
6

में उपयोगकर्ता के स्थान का चिकना अनुसरण करने के बाद मैं उपयोगकर्ता के ब्लू डॉट का पालन करना चाहता हूं जैसे Google मानचित्र इसे करता है। इसका मतलब है कि जब स्थान बदल रहा है तो नक्शा (या इसके केंद्र) को आसानी से इसका पालन करना चाहिए। लेकिन जब मैं प्रतिनिधि के साथ मानक तरीका का उपयोग करें: mapview.userLocation परMKMapView

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    [map setCenterCoordinate:map.userLocation.coordinate animated:YES]; 
} 

या keyvalue पर्यवेक्षक तो नक्शे के लिए कदम काफी "अस्थिर" है, यह जल्दी से नए स्थान पर "कूदता" भले ही मैं animated पैरामीटर का उपयोग करें।

इसके अलावा मुझे लगता है कि नीली बिंदु स्वयं मूल Google मानचित्र ऐप में इतनी आसानी से नहीं बढ़ती है और अक्सर वहां जाने के बजाए नए स्थान पर जाती है।

किसी भी मदद के लिए धन्यवाद।

+0

आईओएस 5 इस सुविधा को ट्रैकिंग मोड के साथ जोड़ता है। आखिरकार! – d0n13

उत्तर

3

'हाय जैक

मैं इस को हल करने के रूप में अच्छी तरह की कोशिश की है लेकिन MKMapView अद्यतन के बीच कुछ फैंसी सामान का उपयोग कर किया जा सकता है की तरह अगले स्थिति का अनुमान है और आंदोलन चिकनी बनाने के लिए यह लग रहा है।

यदि आप कंपास को संभालने के तरीके को देखते हैं तो वे बहुत सारे फ़िल्टरिंग कर रहे हैं क्योंकि कच्चे कंपास डेटा बहुत स्थिर नहीं हैं, इसलिए वे इसे वास्तव में चिकना और चिकनी बनाते हैं।

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

मुझे लगता है कि वे सब कुछ के संपर्क में न सिर्फ हम में से :) डी आगे रखने के लिए

+0

ठीक है, मैं एक ही निष्कर्ष पर आया था। ; ओ) मानचित्र ऐप को कुछ निजी तरीकों का उपयोग करना है जो हम नहीं कर सकते हैं। मैंने 'SetCenterCoordinate: एनिमेटेड:' को UIView एनीमेशन में रखने की भी कोशिश की लेकिन बिना किसी प्रभाव के। – JakubM

0

आप भी इस कोशिश कर सकते:

- (void)adjustRegion:(CLLocation*)location { 
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 150.0, 150.0); 
    MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:viewRegion]; 
    [self.mapView setRegion:adjustedRegion animated:YES]; 
} 
+0

'सीएममोडेल 'क्या है? – Raptor

+1

@ShivanRaptor ओह, यह एक सिंगलटन वर्ग है जहां मैंने कुछ पैरा बचाए। बस उस पंक्ति की प्रतिलिपि बनाई और चिपका दी। श्रीमान, मैं अपना जवाब संपादित करूंगा। – borisdiakur

+0

@ लेगो उस उपयोगकर्ता को आपके द्वारा परिभाषित ज़ूम स्तर का उपयोग करने के लिए मजबूर नहीं करता है?(उन्हें कस्टम परिभाषित करने की बजाय) – RonLugge

1

मैं CLLocationManager प्रतिनिधि अद्यतन तरीकों का इस्तेमाल किया वर्तमान पाने के लिए हर दूसरे स्थान के बारे में स्थान, पिछले स्थान को बचाया और उन लोगों के बीच interpolated। यह थोड़ा और प्रयास है, लेकिन टी ट्रैकिंग को बहुत आसान बनाता है।

#define zoomSpan MKCoordinateSpanMake(0.001f, 0.001f) 

@property (strong, nonatomic) CLLocation *lastLocation; 
@property (strong, nonatomic) MKMapView *mapView; 
@property (strong, nonatomic) CLLocationManager *locationManager; 

... 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    CLLocation *currentLocation = locations[locations.count - 1]; 
    // Set to last location, for faster setting to correct position 
    [self.mapView setRegion:MKCoordinateRegionMake(self.lastLocation.coordinate, zoomSpan) animated:NO]; 

    // Locations in-between coordinates for smooth tracking 
    CLLocationDegrees deltaLat = currentLocation.coordinate.latitude - self.lastLocation.coordinate.latitude; 
    CLLocationDegrees deltaLon = currentLocation.coordinate.longitude - self.lastLocation.coordinate.longitude; 
    NSArray *locationsArray = @[[[CLLocation alloc] initWithLatitude:(self.lastLocation.coordinate.latitude + deltaLat * 0.2) 
                  longitude:(self.lastLocation.coordinate.longitude + deltaLon * 0.2)], 
           [[CLLocation alloc] initWithLatitude:(self.lastLocation.coordinate.latitude + deltaLat * 0.4) 
                  longitude:(self.lastLocation.coordinate.longitude + deltaLon * 0.4)], 
           [[CLLocation alloc] initWithLatitude:(self.lastLocation.coordinate.latitude + deltaLat * 0.6) 
                  longitude:(self.lastLocation.coordinate.longitude + deltaLon * 0.6)], 
           [[CLLocation alloc] initWithLatitude:(self.lastLocation.coordinate.latitude + deltaLat * 0.8) 
                  longitude:(self.lastLocation.coordinate.longitude + deltaLon * 0.8)], 
           currentLocation]; 

    float timer = 0; 
    for (CLLocation *nextLocation in locationsArray) { 
     [self performSelector:@selector(updateMapCenterLocation:) withObject:nextLocation afterDelay:timer]; 
     timer += 0.2; 
    } 
    self.lastLocation = currentLocation; 
} 

- (void)updateMapCenterLocation:(CLLocation *)location 
{ 
    [self.mapView setRegion:MKCoordinateRegionMake(location.coordinate, zoomSpan) animated:YES]; 
} 

यह सुनिश्चित करें कि आप जिस कक्षा (कि मानचित्र दृश्य रखती है सामान्य रूप से दृश्य नियंत्रक) में इस का उपयोग कर रहे CLLocationManager के प्रतिनिधि और CLLocationManagerDelegate प्रोटोकॉल को लागू करने पर सेट है: यहाँ मेरी कोड है।

कुछ अतिरिक्त टिप्पणियाँ:

  • इस कोड के व्यवहार MKUserTracking के समान है, लेकिन इस ज़ूम स्तर कस्टम सेट का समर्थन नहीं करता। ट्रैकिंग शुरू करते समय ज़ूम स्तर को रीसेट करने के लिए एक बग प्रतीत होता है, इसलिए यह कामकाज।
  • zoomSpan वर्तमान में तय किया गया है, लेकिन आप self.mapView.region.span के साथ वर्तमान क्षेत्र की अवधि का भी उपयोग कर सकते हैं।