2012-06-04 10 views
7

चलाता है तो उपयोगकर्ता स्थान से एनोटेशन तक दूरी की गणना कैसे करें मेरे पास एक उपयोगकर्ता स्थान (नीला बिंदु) और एनोटेशन mapView पर है। जब एनोटेशन का चयन किया जाता है, तो मैं पाठ को distLabel पर सेट करता हूं - "बिंदु% 4.0f मीटर से दूरी"। जब उपयोगकर्ता चलता है तो मैं उस टेक्स्ट लेबल को कैसे अपडेट कर सकता हूं?जब उपयोगकर्ता

didSelectAnnotationView:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 

    CLLocation *pinLocation = 
     [[CLLocation alloc] initWithLatitude: 
         [(MyAnnotation*)[view annotation] coordinate].latitude 
           longitude: 
         [(MyAnnotation*)[view annotation] coordinate].longitude]; 
    CLLocation *userLocation = 
     [[CLLocation alloc] initWithLatitude: 
          self.mapView.userLocation.coordinate.latitude    
           longitude: 
           self.mapView.userLocation.coordinate.longitude];   
    CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation]; 

    [distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.",  
                distance]]; 
} 

मैं जानता हूँ कि एक समारोह didUpdateToLocation वहाँ है, लेकिन मैं इसे कैसे didSelectAnnotationView साथ उपयोग कर सकते हैं?

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    //Did update to location 
} 

उत्तर

15

मानचित्र दृश्य एक selectedAnnotations संपत्ति है कि आप didUpdateToLocation विधि में उपयोग कर सकते हैं जो टिप्पणी से दूरी पाने के लिए बताने के लिए है।

(वैसे, अगर आप मानचित्र दृश्य के userLocation उपयोग कर रहे हैं, तो आप didUpdateToLocation के बजाय मानचित्र दृश्य के didUpdateUserLocation प्रतिनिधि विधि का उपयोग करने के लिए एक CLLocationManager प्रतिनिधि विधि है जो चाहते हो सकता है।)

प्रतिनिधि विधि में, आप जांच कर सकते हैं कि वर्तमान में कोई चुना गया एनोटेशन है या नहीं, और यदि ऐसा है, तो उस एनोटेशन की दूरी दिखाएं (अन्यथा "कोई एनोटेशन चयनित नहीं है")।

आप कोड डुप्लिकेशन को कम करने के लिए didSelectAnnotationView और didUpdateUserLocation दोनों से एक सामान्य विधि लिखना चाह सकते हैं।

उदाहरण के लिए:

-(void)updateDistanceToAnnotation:(id<MKAnnotation>)annotation 
{ 
    if (annotation == nil) 
    { 
     distLabel.text = @"No annotation selected"; 
     return; 
    } 

    if (mapView.userLocation.location == nil) 
    { 
     distLabel.text = @"User location is unknown"; 
     return; 
    } 

    CLLocation *pinLocation = [[CLLocation alloc] 
     initWithLatitude:annotation.coordinate.latitude 
       longitude:annotation.coordinate.longitude]; 

    CLLocation *userLocation = [[CLLocation alloc] 
     initWithLatitude:mapView.userLocation.coordinate.latitude 
       longitude:mapView.userLocation.coordinate.longitude]; 

    CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation]; 

    [distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.", distance]]; 
} 

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    if (mapView.selectedAnnotations.count == 0) 
     //no annotation is currently selected 
     [self updateDistanceToAnnotation:nil]; 
    else 
     //first object in array is currently selected annotation 
     [self updateDistanceToAnnotation:[mapView.selectedAnnotations objectAtIndex:0]]; 
} 

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{  
    [self updateDistanceToAnnotation:view.annotation]; 
} 
+0

महान हमेशा की तरह जवाब आप से! धन्यवाद! –