Добавление булавки-аннотации к виду карты при длинном нажатии в быстром
Я пытаюсь сделать приложение для iPhone, которое требует от пользователей возможности долго нажимать на место на карте, чтобы отбросить контакт. Кто-нибудь знает, как это делается?
Поведение наблюдается на картах apple, когда вы долго нажимаете на экран. Он сбросит булавку и представит аннотацию, в которой говорится: "Отброшенный штырь"
Ответы
Ответ 1
1) Создайте экземпляр UILongPressGestureRecognizer
и добавьте его в MKMapView
.
2) Когда селектор вызывается после долгого нажатия пользователя, вызовите метод addAnnotation в MKMapView
с соответствующим заголовком и координатой.
3) Затем убедитесь, что вы соответствуете MKMapViewDelegate
и реализуете viewForAnnotation:
, который вызывается сразу после добавления аннотации и возвращает MKPinAnnotationView
Ответ 2
-
добавить UILongPressGestureRecognizer
в свой MapView
var uilgr = UILongPressGestureRecognizer(target: self, action: "addAnnotation:")
uilgr.minimumPressDuration = 2.0
map.add (uilgr)
//IOS 9
map.addGestureRecognizer(uilgr)
-
Добавить аннотацию к длинному нажатию - func:
func addAnnotation(gestureRecognizer:UIGestureRecognizer){
if gestureRecognizer.state == UIGestureRecognizerState.Began {
var touchPoint = gestureRecognizer.locationInView(map)
var newCoordinates = map.convertPoint(touchPoint, toCoordinateFromView: map)
let annotation = MKPointAnnotation()
annotation.coordinate = newCoordinates
CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: newCoordinates.latitude, longitude: newCoordinates.longitude), completionHandler: {(placemarks, error) -> Void in
if error != nil {
println("Reverse geocoder failed with error" + error.localizedDescription)
return
}
if placemarks.count > 0 {
let pm = placemarks[0] as! CLPlacemark
// not all places have thoroughfare & subThoroughfare so validate those values
annotation.title = pm.thoroughfare + ", " + pm.subThoroughfare
annotation.subtitle = pm.subLocality
self.map.addAnnotation(annotation)
println(pm)
}
else {
annotation.title = "Unknown Place"
self.map.addAnnotation(annotation)
println("Problem with the data received from geocoder")
}
places.append(["name":annotation.title,"latitude":"\(newCoordinates.latitude)","longitude":"\(newCoordinates.longitude)"])
})
}
}
-
или вы можете добавить аннотацию без названия:
func action(gestureRecognizer:UIGestureRecognizer){
var touchPoint = gestureRecognizer.locationInView(map)
var newCoordinates = map.convertPoint(touchPoint, toCoordinateFromView: map)
let annotation = MKPointAnnotation()
annotation.coordinate = newCoordinates
map.addAnnotation(annotation)
}
Ответ 3
Обновить Swift3
func action(gestureRecognizer:UIGestureRecognizer){
let touchPoint = gestureRecognizer.location(in: mapView)
let newCoordinates = mapView.convert(touchPoint, toCoordinateFrom: mapView)
let annotation = MKPointAnnotation()
annotation.coordinate = newCoordinates
mapView.addAnnotation(annotation)
}
Ответ 4
Сначала объявите UIGesture в ViewDidLoad
let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(addWaypoint(LongGesture:)))
mapView.addGestureRecognizer(longGesture)
Второе добавьте функцию longPress
@objc func addWaypoint(LongGesture : UIGestureRecognizer) {
let touchPoint = LongGesture.location(in: mapView)
let wayCoords = mapView.convert(touchPoint, toCoordinateFrom: mapView)
let location = CLLocation(latitude: wayCoords.latitude, longitude: wayCoords.longitude)
myWaypoints.append(location)
let wayAnnotation = MKPointAnnotation()
wayAnnotation.coordinate = wayCoords
wayAnnotation.title = "waypoint"
myAnnotations.append(location)
}
Я рекомендую создавать аннотации в массиве, который будет обслуживать вас позже, если вы хотите его удалить, например...
var myAnnotations = [CLLocation]()
Если у вас есть разные аннотации, вы можете удалить только аннотации, которые вы хотите, для этого, когда вы добавляете новую добавку аннотации к массиву. Чтобы удалить только одну группу аннотаций, выполните следующие
for dots in myAnnotations{
mapView.removeAnnotation(dots)
}
Чтобы удалить все аннотации, попробуйте
mapView.removeAnnotations(mapView.annotations)
Извинения за перевод....