2012-04-09 6 views
1

マップビュー内の選択したアノテーションのサブタイトルまでの距離をユーザーの位置から加算しようとしています。それの仕組みは機能していますが、実際のコールアウトは最初に表示されるときにうんざりします。再描画の問題があるようです。ピンのiOS SDK Mapviewアノテーションコールアウトの再描画エラー

mapView annotation redraw problem

後続タップ正しいレイアウトを示しています。

がここに関連するコードです:注釈

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

} を選択するときに呼び出さ

//私は、[ビューのsetNeedsDisplay]呼び出ししようとしたが、無駄にしました。

ご協力いただきありがとうございます。


ここ

働いたソリューションは、私が最終的に思い付いたソリューションです。それは動作するようです。

私は上記の、didSelectAnnotationView方法から重複したコードを編集した、と思い付いた:あなたは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]; 
    } 
} 

答えて

3

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

長い字幕を設定しても、吹き出しが適切なサイズではないことがわかります。 didSelectAnnotationViewが呼び出される前にサイズを計算する必要があります。

+0

注釈が作成されたときに元の字幕が追加されますが、現在のユーザーの場所から選択した地点までの距離を表示したいので、その情報を追加できません。また、置換された距離ストリングは、実際には元の距離ストリングより小さくてもよい。 –

+0

代わりに、mapView:didUpdateUserLocation:delegateメソッドを使用してユーザーの場所が変更されたときに再計算する必要があります。率直に言って、吹き出しを表示しながら字幕を変更することは、合理的なことではありません。 –

+0

だから、表示する必要があるだけでなく、見えなくてもユーザーの位置が変更されたときに、すべての注釈のサブタイトルを変更する必要がありますか?私はそれがより合理的である方法として混乱している。あなたは精緻化できますか?ありがとう。 –