web-dev-qa-db-ja.com

MapKitでピンをドロップするにはどうすればよいですか?

アプリのユーザーが地図内の場所を選択できるようにしたいと思います。ネイティブマップには、ピンをドロップすることで何かを見つけることができる「ピンのドロップ」機能があります。 MapKitでこれを行うにはどうすればよいですか?

18
erotsppa

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メンバーを確認することで、ドラッグされた注釈の座標を取得できます。

27
RedBlueThing

ピンを落とす方法は複数ありますが、質問でどちらの方法を指定するかは指定しません。最初の方法はプログラムで行うことです。そのため、カスタムクラスは実際には必要ないことを除いて、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);
}
23
JugsteR

あなたは、 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];
8
Shabeer Ali

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;
}
3
venshua