web-dev-qa-db-ja.com

swift

ピンをドロップするためにユーザーがマップビュー上の場所を長押しできる必要があるiPhoneアプリを作成しようとしています。これがどのように行われるかを誰かが知っていますか?

この動作は、Appleマップで確認できます。画面を長押しすると、ピンがドロップされ、「ピンがドロップされました」という注釈が表示されます

12
Matt Spoon

1)UILongPressGestureRecognizerをインスタンス化し、MKMapViewに追加します。

2)ユーザーが長押しした後にセレクターが呼び出されたら、適切なタイトルと座標でMKMapViewの-​​addAnnotation methodを呼び出します。

3)次に、MKMapViewDelegateに準拠していることを確認し、viewForAnnotation:を実装します。これは、アノテーションを追加してMKPinAnnotationViewを返した直後に呼び出されます

10
Josh Hamet
  1. mapViewにUILongPressGestureRecognizerを追加します

    var uilgr = UILongPressGestureRecognizer(target: self, action: "addAnnotation:")
    uilgr.minimumPressDuration = 2.0
    
    map.add (uilgr)
    
    //IOS 9
    map.addGestureRecognizer(uilgr) 
    
  2. 長押し検出に注釈を追加-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)"])
        })
    }
    }
    
  3. または、タイトルなしで注釈を追加できます。

    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)
    }
    
29
itzhar

最初にUIGestureRecognizerviewDidLoadで宣言します

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]()

別の注釈がある場合、必要な注釈のみを削除できます。そのため、新しい注釈を配列に追加するときに追加します。注釈のグループを1つだけ削除するには、次のようにします。

for dots in myAnnotations{
    mapView.removeAnnotation(dots)
}

すべての注釈を削除するには、

mapView.removeAnnotations(mapView.annotations)

翻訳の謝罪....

5
oscar castellon

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)
}
2
K. Sergey