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

Как добавить прижимной контакт к MKMapView (IOS) при касании?

Мне нужно было получить координату точки, где пользователь касается MKMapView. Я не работаю с Интерфейсным Разработчиком. Можете ли вы привести мне один пример?

4b9b3361

Ответ 1

Для этого вы можете использовать UILongPressGestureRecognizer. Везде, где вы создаете или инициализируете вид карты, сначала присоедините к нему распознаватель:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //user needs to press for 2 seconds
[self.mapView addGestureRecognizer:lpgr];
[lpgr release];

Затем в обработчике жестов:

- (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan)
        return;

    CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView];   
    CLLocationCoordinate2D touchMapCoordinate = 
        [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];

    YourMKAnnotationClass *annot = [[YourMKAnnotationClass alloc] init];
    annot.coordinate = touchMapCoordinate;
    [self.mapView addAnnotation:annot];
    [annot release];
}

YourMKAnnotationClass - это определенный вами класс, соответствующий протоколу MKAnnotation. Если ваше приложение будет работать только на iOS 4.0 или более поздней версии, вы можете использовать предопределенный класс MKPointAnnotation.

Примеры создания собственного класса MKAnnotation см. В примере приложения MapCallouts.

Ответ 2

Спасибо Анне за такой замечательный ответ! Вот версия Swift, если кому-то интересно (ответ был обновлен до синтаксиса Swift 4.1).

Создание UILongPressGestureRecognizer:

let longPressRecogniser = UILongPressGestureRecognizer(target: self, action: #selector(MapViewController.handleLongPress(_:)))
longPressRecogniser.minimumPressDuration = 1.0
mapView.addGestureRecognizer(longPressRecogniser)

Обработка жеста:

@objc func handleLongPress(_ gestureRecognizer : UIGestureRecognizer){
    if gestureRecognizer.state != .began { return }

    let touchPoint = gestureRecognizer.location(in: mapView)
    let touchMapCoordinate = mapView.convert(touchPoint, toCoordinateFrom: mapView)

    let album = Album(coordinate: touchMapCoordinate, context: sharedContext)

    mapView.addAnnotation(album)
}