Как добавить канцелярскую кнопку в MKMapView(IOS) при касании?
Я должен был получить координату точки, где пользователь касается MKMapView. Я не работаю с Интерфейсным Разработчиком. Можете ли вы дать мне один пример или ссылку.
большое спасибо
2 ответа
Для этого вы можете использовать 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 см. В примерах приложений WeatherMap и MapCallouts.
Спасибо Анне за такой замечательный ответ! Вот версия 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)
}