7

にユーザーの場所 (青い点) と注釈がありmapViewます。注釈が選択されている場合、テキストをdistLabel「ポイント %4.0f m までの距離」に設定します。ユーザーが移動したときにそのテキスト ラベルを更新するにはどうすればよいですか?

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
}
4

1 に答える 1

15

マップ ビューには、距離を取得する注釈を指定するメソッドselectedAnnotationsで使用できるプロパティがあります。didUpdateToLocation

(ちなみに、マップ ビューの を使用している場合は、デリゲート メソッドではなくuserLocation、マップ ビューのデリゲート メソッドを使用することをお勧めします。)didUpdateUserLocationdidUpdateToLocationCLLocationManager

デリゲート メソッドでは、現在選択されている注釈があるかどうかを確認し、存在する場合はその注釈までの距離を表示できます (そうでない場合は、「注釈が選択されていません」と言う)。

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];
}
于 2012-06-04T12:55:24.263 に答える