Добавление булавки-аннотации к виду карты при длинном нажатии в быстром

Я пытаюсь сделать приложение для 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)

Извинения за перевод....