ピンをドロップするためにユーザーがマップビュー上の場所を長押しできる必要があるiPhoneアプリを作成しようとしています。これがどのように行われるかを誰かが知っていますか?
この動作は、Appleマップで確認できます。画面を長押しすると、ピンがドロップされ、「ピンがドロップされました」という注釈が表示されます
1)UILongPressGestureRecognizer
をインスタンス化し、MKMapView
に追加します。
2)ユーザーが長押しした後にセレクターが呼び出されたら、適切なタイトルと座標でMKMapView
の-addAnnotation methodを呼び出します。
3)次に、MKMapViewDelegate
に準拠していることを確認し、viewForAnnotation:
を実装します。これは、アノテーションを追加してMKPinAnnotationView
を返した直後に呼び出されます
mapViewにUILongPressGestureRecognizer
を追加します
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)
}
最初にUIGestureRecognizer
を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]()
別の注釈がある場合、必要な注釈のみを削除できます。そのため、新しい注釈を配列に追加するときに追加します。注釈のグループを1つだけ削除するには、次のようにします。
for dots in myAnnotations{
mapView.removeAnnotation(dots)
}
すべての注釈を削除するには、
mapView.removeAnnotations(mapView.annotations)
翻訳の謝罪....
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)
}