Подтвердить что ты не робот

Как сбросить булавку с помощью MapKit?

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

вы можете получить касание местоположения, jcesarmobile ответить на получение tapped координаты с 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];

Ответ 4

Вам также может потребоваться установить делегат MapView.

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