Как мне вставить пин-код с помощью MapKit? - PullRequest
18 голосов
/ 16 декабря 2009

Я бы хотел, чтобы пользователь моего приложения мог выбрать местоположение на карте. Нативная карта имеет функцию «булавка», где вы можете найти что-то, уронив булавку. Как я могу сделать это в MapKit?

Ответы [ 4 ]

27 голосов
/ 17 декабря 2009

Вам необходимо создать объект, который реализует протокол 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, чтобы выяснить, куда поставить булавку на карте.

Если вы хотите настроить представление аннотаций, вам необходимо реализовать метод MKMapViewDelegate viewForAnnotation в контроллере вида карты:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation

Если вы хотите реализовать функцию перетаскивания, вы можете прочитать об обработке событий касания аннотации в Справочная библиотека Apple OS .

Вы также можете проверить эту статью о перетаскивании с помощью mapkit, которая ссылается на рабочую библиотеку сэмплов на GitHub . Вы можете получить координаты перетаскиваемой аннотации, проверив элемент _coordinates на объекте DDAnnotation .

23 голосов
/ 11 декабря 2012

Есть несколько способов опустить булавку, и вы не указываете, как это сделать в своем вопросе. Первый способ - сделать это программно, для этого вы можете использовать то, что написал 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);
}
8 голосов
/ 07 апреля 2015

Вы можете получить доступ к местоположению, 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];
3 голосов
/ 28 января 2013

Возможно, вам также потребуется установить MapView Delegate.

[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;
}
...