自定义 MKPointAnnotation 不响应用户交互
Custom MKPointAnnotation isn't responding to user interaction
我正在制作一个使用 MKPointAnnotation
s 的 Swift 应用程序,我最近 运行 遇到了一个问题,我需要在我的注释中存储元数据,所以我创建了自定义class 以下:
class BRETTFAnnotation: MKPointAnnotation {
var tag: Int64
var name: String
init(lat : Double, lon:Double, t : Int64, n: String) {
self.tag = t
self.name = n
super.init()
self.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
}
}
我的MKAnnotationView
viewforMKAnnotation
方法如下所示:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let newAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "reuse")
newAnnotation.canShowCallout = true
let right = self.button(title: "Yes")
right?.addTarget(self, action: #selector(clickedToConfirmNewPoint), for: .touchUpInside)
newAnnotation.rightCalloutAccessoryView = right
let left = self.button(title: "No")
left?.addTarget(self, action: #selector(clickedToCancelNewPoint), for: .touchUpInside)
newAnnotation.leftCalloutAccessoryView = left
return newAnnotation
}
我 运行 遇到的问题是,每当我单击我的自定义 BRETTFAnnotation
(我将其添加到我的 MKMapView
)时,什么都没有发生。当我只是使用 MKPointAnnotation
(而不是 BRETTFAnnotation
)时,当我在地图上单击时,MKAnnotationView
上的两个按钮会显示。 我正在尝试使用 BRETTFAnnotation
而不是 MKPointAnnotation
让 MKPinAnnotationView
在触摸时显示。
如何在用户同时点击注释时继续使用我的自定义注释并显示标注?
编辑 1:因为它可能有用,下面的代码是我制作注释并将其添加到 mapView 的方式。
let location = gestureRecognizer.location(in: mapView)
let coordinate = mapView.convert(location,toCoordinateFrom: mapView)
print("adding lat,long \(coordinate.latitude),\(coordinate.longitude)")
lastPoint = BRETTFAnnotation(lat: coordinate.latitude, lon: coordinate.longitude, t: 1, n: "")
let annotationView = MKPinAnnotationView(annotation: lastPoint, reuseIdentifier: "reuse")
mapView.addAnnotation(lastPoint)
当您使用自己的 MKAnnoation 时,您可以在 didSelect 中处理您的操作。只需执行以下代码即可。
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
if let yourAnnotation = view.annotation as? BRETTFAnnotation {
//handle your meta data or/and show UIViews or whatever
}
}
和
func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
//getting called when you tap on map or on another annotation (not the selected annotation before)
//hide UIViews or do whatever you want
}
这对我有用:
class ViewController: UIViewController, MKMapViewDelegate {
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
print("didSelect")
if let annoation = view.annotation as? MyAnnoation {
print("metatag \(annoation.metaTag)")
}
}
func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
print("didDeselect")
}
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
let annotation = MyAnnoation(n: "name", m: "metaTag")
annotation.coordinate = CLLocationCoordinate2D(latitude: 50.0, longitude: 8.0)
mapView.addAnnotation(annotation)
}
}
class MyAnnoation: MKPointAnnotation {
var name: String?
var metaTag: String?
init(n: String, m: String) {
self.name = n
self.metaTag = m
}
}
我通过让我的 BRETTFAnnotation
成为 NSObject
和 MKAnnotation
的子 class 而不是 MKPointAnnotation
来解决这个问题。这样做允许我的自定义 class 接收用户交互并显示标注。
我正在制作一个使用 MKPointAnnotation
s 的 Swift 应用程序,我最近 运行 遇到了一个问题,我需要在我的注释中存储元数据,所以我创建了自定义class 以下:
class BRETTFAnnotation: MKPointAnnotation {
var tag: Int64
var name: String
init(lat : Double, lon:Double, t : Int64, n: String) {
self.tag = t
self.name = n
super.init()
self.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
}
}
我的MKAnnotationView
viewforMKAnnotation
方法如下所示:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let newAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "reuse")
newAnnotation.canShowCallout = true
let right = self.button(title: "Yes")
right?.addTarget(self, action: #selector(clickedToConfirmNewPoint), for: .touchUpInside)
newAnnotation.rightCalloutAccessoryView = right
let left = self.button(title: "No")
left?.addTarget(self, action: #selector(clickedToCancelNewPoint), for: .touchUpInside)
newAnnotation.leftCalloutAccessoryView = left
return newAnnotation
}
我 运行 遇到的问题是,每当我单击我的自定义 BRETTFAnnotation
(我将其添加到我的 MKMapView
)时,什么都没有发生。当我只是使用 MKPointAnnotation
(而不是 BRETTFAnnotation
)时,当我在地图上单击时,MKAnnotationView
上的两个按钮会显示。 我正在尝试使用 BRETTFAnnotation
而不是 MKPointAnnotation
让 MKPinAnnotationView
在触摸时显示。
如何在用户同时点击注释时继续使用我的自定义注释并显示标注?
编辑 1:因为它可能有用,下面的代码是我制作注释并将其添加到 mapView 的方式。
let location = gestureRecognizer.location(in: mapView)
let coordinate = mapView.convert(location,toCoordinateFrom: mapView)
print("adding lat,long \(coordinate.latitude),\(coordinate.longitude)")
lastPoint = BRETTFAnnotation(lat: coordinate.latitude, lon: coordinate.longitude, t: 1, n: "")
let annotationView = MKPinAnnotationView(annotation: lastPoint, reuseIdentifier: "reuse")
mapView.addAnnotation(lastPoint)
当您使用自己的 MKAnnoation 时,您可以在 didSelect 中处理您的操作。只需执行以下代码即可。
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
if let yourAnnotation = view.annotation as? BRETTFAnnotation {
//handle your meta data or/and show UIViews or whatever
}
}
和
func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
//getting called when you tap on map or on another annotation (not the selected annotation before)
//hide UIViews or do whatever you want
}
这对我有用:
class ViewController: UIViewController, MKMapViewDelegate {
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
print("didSelect")
if let annoation = view.annotation as? MyAnnoation {
print("metatag \(annoation.metaTag)")
}
}
func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
print("didDeselect")
}
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
let annotation = MyAnnoation(n: "name", m: "metaTag")
annotation.coordinate = CLLocationCoordinate2D(latitude: 50.0, longitude: 8.0)
mapView.addAnnotation(annotation)
}
}
class MyAnnoation: MKPointAnnotation {
var name: String?
var metaTag: String?
init(n: String, m: String) {
self.name = n
self.metaTag = m
}
}
我通过让我的 BRETTFAnnotation
成为 NSObject
和 MKAnnotation
的子 class 而不是 MKPointAnnotation
来解决这个问题。这样做允许我的自定义 class 接收用户交互并显示标注。