1

マップビューでユーザーの位置から選択した注釈のサブタイトルまでの距離を追加しようとしています。その仕組みは機能していますが、実際のコールアウトは、最初に表示されたときに混乱します。再描画の問題があるようです。

mapView注釈の再描画の問題

その後ピンをタップすると、正しいレイアウトが表示されます。

関連するコードは次のとおりです。

//注釈を選択するときに呼び出されます

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

MKPointAnnotation *selectedAnnotation = view.annotation;

//attempt to add distance on annotation
CLLocation *pointALocation = [[CLLocation alloc] 
                              initWithLatitude:selectedAnnotation.coordinate.latitude 
                              longitude:selectedAnnotation.coordinate.longitude];
float distanceMeters = [pointALocation distanceFromLocation:locationManager.location];

//for sending info to detail
myPinTitle = selectedAnnotation.title;

[selectedAnnotation setSubtitle:[NSString stringWithFormat:@"%.2f miles away", (distanceMeters / 1609.344)]];

[view setNeedsDisplay]を呼び出してみましたが、役に立ちませんでした。

よろしくお願いします。


うまくいったソリューション

これが私がついに思いついた解決策です。うまくいくようです。

上記のdidSelectAnnotationViewメソッドから重複したコードを編集して、次のことを思いつきました。

//called when user location changes

- (void)updatePinsDistance
{
for (int x=0; x< [[mapView annotations]count]; x++) {
    MKPointAnnotation *thisPin =[[mapView annotations] objectAtIndex:x];

    //attempt to add distance on annotation
    CLLocation *pointALocation = [[CLLocation alloc] 
                                 initWithLatitude:thisPin.coordinate.latitude 
                                 longitude:thisPin.coordinate.longitude];
    float distanceMeters = [pointALocation distanceFromLocation:locationManager.location];
    NSString *distanceMiles = [NSString stringWithFormat:@"%.2f miles from you",
                                                    (distanceMeters / 1609.344)];

    [thisPin setSubtitle:distanceMiles];
    }
}
4

1 に答える 1

3

字幕を didSelectAnnotationView 以外の場所に設定する必要があります。実際には、すべての annotationView は、mapView:viewForAnnotation: メソッドによって返される前に、タイトルとサブタイトルを設定する必要があります。

長いサブタイトルを設定したという事実は、コールアウトが適切なサイズではないことを確かに説明しています. didSelectAnnotationView を呼び出す前に、サイズを計算する必要があります。

于 2012-04-09T17:03:54.660 に答える