2012-03-05 3 views
4

私のアプリでは、特定の間隔でサーバーからその場所(緯度と経度)を取得することによって他の人の位置を示しています。サーバのデータ(緯度と経度)に応じてMKMapViewの注釈を移動する

私はすべての注釈を削除し、サーバーデータに基づいて新しい注釈を削除する必要があります。

しかし、同じユーザーの注釈が既に存在していても、同じユーザー注釈を削除して追加すると非常に非効率的に見えます。

MKAnnotationをある座標から他の座標に移動できますか?私は "setCoordinate"プロパティを試みましたが、それをsuccesfulyできませんでした。

また、「タッチアンドドラッグ」の種類でもありません。注釈は、アプリケーションがサーバーからデータ(緯度と経度)を取得すると自動的に移動します。

+0

setCoordinateが機能しなかった理由(コンパイラエラー、警告、実行時エラー、クラッシュ、その他)を詳しく説明してください。注釈クラス.hと.mを表示します。最後の段落の意味を理解しないでください(「タッチしないでドラッグします...」)。 – Anna

+0

実際には、MKMapViewのMKAnnotationオブジェクトにアクセスする方法はわかりません。(「viewForAnnotation :(id )注釈」以外のところでは)..私は... NSArray * pinGreen = [[NSArray alloc] initWithArray:[self。 mapViewアノテーション]]; \t \t { \t \t \t \t \t { \t \t([:I] isKindOfClass [MapViewAnnotationクラス] [pinGreen objectAtIndex])場合(; iが

+0

「不可能」という結論は間違っています。もちろん、アノテーション上でsetCoordinateを使用して、アノテーションビューを直接的または間接的に移動することもできます。 – Anna

答えて

0

なぜパフォーマンスに問題がありますか?あなたはそれをmesauredしましたか? オブジェクトの配列を変更するだけで、新しいインスタンスを作成することさえできません。

MapViewのAnnotationViewsは、とにかく再利用されます。それに問題はないはずです。

+0

はい、あなたは正しいです。再利用されます。しかし、ピンを場所の変更として移動してから、削除して再描画する方が良いです(実際にはクライアントの要件です)。だから、私はそれらを削除し、同じユーザーのために再描画の代わりに移動したい。 –

+0

ok..thanks ...それは自分自身のMKAnnotationビューを移動することは不可能であることを意味します –

3

アノテーションの座標を削除、再作成、再追加せずに変更するには、coordinateプロパティが設定可能なアノテーションクラスを作成します。これを行うための簡単な方法は、このようcoordinateプロパティを定義することです:代わりに独自のクラスを定義する、

また
@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 

、あなたはまた、設定可能なcoordinateが内蔵されていMKPointAnnotationクラスを使用することができます。

最初に注釈を作成して追加します。例:あなたは、サーバーと「ユーザー1」の変化のための座標からアップデートを取得するときに

MKPointAnnotation *pa = [[MKPointAnnotation alloc] init]; 
pa.coordinate = someCoordinate; 
pa.title = @"User1"; 
[mapView addAnnotation:pa]; 
[pa release]; 

後で、あなたはマップビューのannotations配列で、そのユーザの注釈を検索したり、注釈への参照を格納しますか、他の構造ではNSMutableDictionaryのようなキーを使って素早くアクセスできます。

注釈が見つかったら、注釈のcoordinateプロパティを新しい値に設定するだけで、マップビューは自動的に注釈のビューを新しい場所に移動します。

この例では、annotations配列検索:

for (id<MKAnnotation> ann in mapView.annotations) 
{ 
    if ([ann isKindOfClass:[YourAnnotationClass class]]) 
    { 
     YourAnnotationClass *yacAnn = (YourAnnotationClass *)ann; 
     if (yacAnn.userIdNumber == user1Id) 
     { 
      yacAnn.coordinate = theNewCoordinate; 
      break; 
     } 
    } 
} 

:あなたは、アノテーションクラスの異なる、カスタムプロパティを(たとえば、いくつかのuserIdNumberという名前のint型)を使用して注釈を検索したい場合は

for (id<MKAnnotation> ann in mapView.annotations) 
{ 
    if ([ann.title isEqualToString:@"User1"]) 
    { 
     ann.coordinate = theNewCoordinate; 
     break; 
    } 
} 

を上記は、座標を変更する方法の例です。座標を変更する注釈がたくさんある場合は、1つずつ検索することはお勧めしません。その代わりに、参照を辞書に格納し、キー値を使用して参照をすばやく検索することができます。