アプリのユーザーが地図内の場所を選択できるようにしたいと思います。ネイティブマップには、ピンをドロップすることで何かを見つけることができる「ピンのドロップ」機能があります。 MapKitでこれを行うにはどうすればよいですか?
MKAnnotationプロトコルを実装するオブジェクトを作成してから、そのオブジェクトをMKMapViewに追加する必要があります。
@interface AnnotationDelegate : NSObject <MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString * title;
NSString * subtitle;
}
デリゲートオブジェクトをインスタンス化し、マップに追加します。
AnnotationDelegate * annotationDelegate = [[[AnnotationDelegate alloc] initWithCoordinate:coordinate andTitle:title andSubtitle:subt] autorelease];
[self._mapView addAnnotation:annotationDelegate];
マップはAnnotationDelegateの座標プロパティにアクセスして、ピンをマップ上のどこに配置するかを見つけます。
注釈ビューをカスタマイズする場合は、マップビューコントローラーにMKMapViewDelegateviewForAnnotationメソッドを実装する必要があります。
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
ピンドラッグ機能を実装したい場合は、 Apple OSリファレンスライブラリ で注釈タッチイベントの処理について読むことができます。
GitHub で動作するサンプルライブラリを参照するmapkitを使用したドラッグアンドドロップで この記事 を確認することもできます。 DDAnnotationオブジェクトの_ coordinatesメンバーを確認することで、ドラッグされた注釈の座標を取得できます。
ピンを落とす方法は複数ありますが、質問でどちらの方法を指定するかは指定しません。最初の方法はプログラムで行うことです。そのため、カスタムクラスは実際には必要ないことを除いて、RedBlueThingが書いたものを使用できます(対象とするiOSのバージョンによって異なります)。 iOS 4.0以降では、このスニペットを使用してプログラムでピンをドロップできます。
// Create your coordinate
CLLocationCoordinate2D myCoordinate = {2, 2};
//Create your annotation
MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
// Set your annotation to point at your coordinate
point.coordinate = myCoordinate;
//If you want to clear other pins/annotations this is how to do it
for (id annotation in self.mapView.annotations) {
[self.mapView removeAnnotation:annotation];
}
//Drop pin on map
[self.mapView addAnnotation:point];
たとえば、実際のmapViewを長押ししてピンをドロップできるようにする場合は、次のように実行できます。
// Create a gesture recognizer for long presses (for example in viewDidLoad)
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 0.5; //user needs to press for half a second.
[self.mapView addGestureRecognizer:lpgr]
- (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
return;
}
CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView];
CLLocationCoordinate2D touchMapCoordinate = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];
MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
point.coordinate = touchMapCoordinate;
for (id annotation in self.mapView.annotations) {
[self.mapView removeAnnotation:annotation];
}
[self.mapView addAnnotation:point];
}
すべてのアノテーションを列挙する場合は、両方のスニペットのコードを使用してください。これは、すべての注釈の位置をログに記録する方法です。
for (id annotation in self.mapView.annotations) {
NSLog(@"lon: %f, lat %f", ((MKPointAnnotation*)annotation).coordinate.longitude,((MKPointAnnotation*)annotation).coordinate.latitude);
}
あなたは、 jcesarmobile タップされたときに答える iphone mapkitとの座標 によって触れられた場所を得ることができ、あなたは以下のようにどこにでもピンを落とすことができます
// Define pin location
CLLocationCoordinate2D pinlocation;
pinlocation.latitude = 51.3883454 ;//set latitude of selected coordinate ;
pinlocation.longitude = 1.4368011 ;//set longitude of selected coordinate;
// Create Annotation point
MKPointAnnotation *Pin = [[MKPointAnnotation alloc]init];
Pin.coordinate = pinlocation;
Pin.title = @"Annotation Title";
Pin.subtitle = @"Annotation Subtitle";
// add annotation to mapview
[mapView addAnnotation:Pin];
MapViewDelegateを設定する必要がある場合もあります。
[mkMapView setDelegate:self];
次に、そのデリゲートをviewForAnnotation
と呼びます。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
MKPinAnnotationView *pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"current"];
pinAnnotationView.animatesDrop = YES;
pinAnnotationView.pinColor = MKPinAnnotationColorRed;
return pinAnnotationView;
}