mkmapview移動アノテーションは自動的に - それらをアニメーション化しますか?
-
29-09-2019 - |
質問
非常に迅速に更新できる注釈のデータセットがあります。現時点では、すべての注釈を削除してから、マップにリプロットします。
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ファイル、私はセット調整メソッドを持っていません。
#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
解決
SetCoodinateメソッド(または同等の)を使用して注釈の座標を更新すると、マップビューはビューの注釈の位置を自動的に更新します。 このページ ドキュメントで次のように述べています:
重要:クラスに座標プロパティを実装する場合、その作成を合成することをお勧めします。このプロパティのメソッドを自分で実装することを選択した場合、またはアノテーションがマップに追加された後、クラスの他の部分のそのプロパティの根底にある変数を手動で変更した場合は、キー価値観測(KVO)を必ず送信してくださいあなたがそうするときの通知。 MAPキットはKVO通知を使用して、注釈の座標、タイトル、およびサブタイトルプロパティの変更を検出し、マップディスプレイに必要な変更を行います。 KVO通知を送信しない場合、注釈の位置をマップ上で適切に更新できない場合があります。
マップビューは、座標が変更されたことを(KVO経由で)告げられた場合にのみ、注釈の座標プロパティを再読み再読むことを知っています。それを行う1つの方法は、セット調整法を実装し、注釈の場所を更新するコードを持っているところならどこでもそれを呼び出すことです。
コードでは、読み取りプロパティ自体の座標を再計算しています。できることは、これをAnnotation .mファイル(および.h)に追加することです。
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
//do nothing
}
また、場所を更新する場所では、注釈のsetCoodinateメソッドを呼び出します。
[someAnnotation setCoordinate:someAnnotation.coordinate];
これを、現在注釈を削除/再添加した場所で行うことができます。
上記の呼び出しは、Coordinate-Getterメソッドに座標recalcがあるため、面白そうに見えます。迅速な修正/テストとして機能するはずですが、定期的に使用することはお勧めしません。
代わりに、注釈の位置を外側(現在注釈を削除/再び削除/再添加する場所)を再び作成し、新しい座標をsetCoodinateに渡すことができます。アノテーションオブジェクトは、現在持っているLAT/LNG IVARSに新しい場所を保存できます(セット調整で設定し、それらのみを使用してcllocationCoodinate2Dを構築してゲッターから戻ります)、または(より良い)座標ivar自体を使用します(設定します)調整して、ゲッターに返します)。