11

非常に迅速に更新できる注釈のデータセットがあります。現時点では、すべての注釈を削除してから、マップに再プロットします。

NSArray *existingpoints = [mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]];
[mapView removeAnnotations:existingpoints];

とにかくカスタムオブジェクト内のどこにあるかを計算するので、これを呼び出して、注釈を削除してマップに再度追加することなく、注釈を「移動」できるようにしたいと思います。私が行う呼び出しの例は、機能し、ほぼ「ポーリング」したいものを以下に示します。

- (CLLocationCoordinate2D) coordinate
{
    CLLocationCoordinate2D coord;
    coord.latitude = [lat doubleValue];
    coord.longitude = [lon doubleValue];


        double differencetime = exampleTime;
        double speedmoving;
        double distanceTravelled = speedmoving * differencetime;

        CLLocationDistance movedDistance = distanceTravelled;
        double radiansHeaded = DEG2RAD([self.heading doubleValue]);
        CLLocation *newLocation = [passedLocation newLoc:movedDistance along:radiansHeaded];
        coord = newLocation.coordinate;

    return coord;
}

要求に応じて、オブジェクトの.hファイルにはSetCoordinateメソッドがありません。

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>

@interface TestObject : NSObject <MKAnnotation>{
    NSString *adshex;
    NSString *lat;
    NSString *lon;


    NSString *title;
    NSString *subtitle;


    CLLocationCoordinate2D coordinate;
}
@property(nonatomic,retain)NSString *adshex;
@property(nonatomic,retain)NSString *lat;
@property(nonatomic,retain)NSString *lon;


@property(nonatomic,retain)NSString *title;
@property(nonatomic,retain)NSString *subtitle;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;


- (CLLocationCoordinate2D) coordinate;

@end
4

1 に答える 1

21

setCoordinateメソッド(または同等のメソッド)を使用して注釈の座標を更新すると、マップビューはビュー上の注釈の位置を自動的に更新します。 ドキュメントのこのページには、次のように書かれています。

重要:クラスにcoordinateプロパティを実装するときは、その作成を合成することをお勧めします。このプロパティのメソッドを自分で実装することを選択した場合、またはアノテーションがマップに追加された後にクラスの他の部分でそのプロパティの基になる変数を手動で変更する場合は、必ずKey-Value監視(KVO)を送信してください。あなたがするときの通知。Map Kitは、KVO通知を使用して、注釈の座標、タイトル、およびサブタイトルのプロパティの変更を検出し、マップの表示に必要な変更を加えます。KVO通知を送信しないと、注釈の位置がマップ上で正しく更新されない場合があります。

マップビューは、座標が変更されたことが(KVOを介して)通知された場合にのみ、注釈の座標プロパティを再読み取りすることを認識します。これを行う1つの方法は、setCoordinateメソッドを実装し、アノテーションの場所を更新するコードがある場合はいつでもそれを呼び出すことです。

コードでは、読み取り専用の座標プロパティ自体で座標を再計算しています。できることは、これを注釈.mファイル(および.h)に追加することです。

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
    //do nothing
}

場所を更新する場所で、アノテーションのsetCoordinateメソッドを呼び出します。

[someAnnotation setCoordinate:someAnnotation.coordinate];

これは、現在注釈を削除/再追加している場所で行うことができます。

上記の呼び出しは、coordinate-getterメソッドで座標を再計算するため、面白く見えます。クイックフィックス/テストとして機能するはずですが、定期的に使用することはお勧めしません。

代わりに、注釈の外側の位置(現在注釈を削除/再追加している場所)を再計算し、新しい座標をsetCoordinateに渡すことができます。アノテーションオブジェクトは、現在持っているlat / lng ivarに新しい場所を保存するか(setCoordinateに設定し、それらのみを使用して、ゲッターから戻るCLLocationCoordinate2Dを構築します)、または(より良い)座標ivar自体を使用します( setCoordinateを使用して、ゲッターに返します)。

于 2010-11-06T16:11:19.527 に答える