0

マップビューにmkannotationsをプロットするアプリがあります(私の用語が正しく理解されているといいのですが...ちょっと紛らわしいです)。

あなたがそれらをタップしたときの字幕はすでに含まれています。

私はそれらのコールアウトに距離を含める方法をオンラインで探していましたが、まだそこにはありません。私は2つの部分的な解決策に出くわし、それらを組み合わせる必要があるかどうか疑問に思いました。

  1. まず、CoreLocationをプロジェクトに追加していませんでしたが、必要ですか?ユーザーの位置を常に更新し、各ポイントまでの距離を計算できるようにするには?または、Mapkitには、使用できるユーザー位置データが含まれていますか?

  2. 部分的なソリューションAは、次のコードを使用します。

`-(void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation

       fromLocation:(CLLocation *)oldLocation {

if(!newLocation) return;

if ((oldLocation.coordinate.latitude != newLocation.coordinate.latitude) &&

    (oldLocation.coordinate.longitude != newLocation.coordinate.longitude)){

    CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:oldLocation.coordinate.latitude longitude:oldLocation.coordinate.longitude];

    CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];

    CLLocationDistance distance = ([loc2 distanceFromLocation:loc1]) * 0.000621371192;

    //distance = distance;

    NSLog(@"Total Distance %f in miles",distance);

}   

}

この方法で2点間の距離を計算することを理解しています。どういうわけか、注釈を循環して距離を作成する必要があります。現在のuserLocationに基づいて距離を常に再計算するため、これはより便利な方法のようです。しかし、私はそれの有効性について疑問に思います。何かがどれだけ離れているかを知ったら、それがどれだけ離れているかを常に思い出させたいと思うことはめったにありません。

  1. 部分的なソリューションBは、次のコードを使用します。

`-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {

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];

NSLog(@"Distance to pin %4.0f", distance);

} `

この場合、ピンをタップするたびに距離が計算されます。しかし、MyAnnotation [注釈の表示]のコードについては不明です。元のポスターの場所はMyAnnotationクラスに基づいていると推測しているので、MyLocationに変更すると、1つを除くすべてのエラーがなくなりました。何らかの理由で、最後の角括弧のpinLocation行で予期される識別子エラーが発生します。

解決策は私の舌の先にあると感じています。その少し余分なプッシュが必要です:)

みんなありがとう

4

1 に答える 1

0

行の直後のcalloutAccessoryControlTappedメソッド内のコードを、どこにでも移動するだけで、MKAnnotationが作成されます。MKAnnotationサブクラスにfloatdistanceプロパティを指定し、それをサブタイトルとして設定します。

于 2013-01-11T22:29:02.377 に答える