ios - MKMarkerAnnotationView 不显示标注
问题描述
我目前正在为通过 MapKit 添加到我的地图视图中的注释创建标注。注释效果很好,但目前没有显示标注,即使我使用正确的代码来启用它们(我相信)。
这是我的viewFor annotation
代码块。
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation {
return nil
}
if let annotation = annotation as? ClusterAnnotation {
let identifier = "cluster"
return mapView.annotationView(annotation: annotation, reuseIdentifier: identifier)
} else {
let identifier = "pin"
let annotationView = mapView.annotationView(of: MKMarkerAnnotationView.self, annotation: annotation, reuseIdentifier: identifier)
annotationView.isEnabled = true
annotationView.canShowCallout = true
annotationView.accessibilityLabel = "hi"
annotationView.isHidden = false
annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
annotationView.markerTintColor = UIColor.customBlue()
annotationView.glyphImage = UIImage(named: "person")
return annotationView
}
}
功能的扩展代码块annotationView
。
extension MKMapView {
func annotationView<T: MKAnnotationView>(of type: T.Type, annotation: MKAnnotation?, reuseIdentifier: String) -> T {
guard let annotationView = dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) as? T else {
return type.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
}
annotationView.annotation = annotation
return annotationView
}
}
当我选择它时,注释会放大,并且在didSelect
代码块中它运行我通过它运行的打印语句。不完全确定发生了什么不允许标注显示,即使我已经启用了几乎所有内容。
解决方案
请使用此代码。这段代码对我来说很好。本代码支持 Swift4 和 Swift5。
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
// Don't want to show a custom image if the annotation is the user's location.
if (annotation is MKUserLocation) {
return nil
} else {
let annotationIdentifier = "AnnotationIdentifier"
let nibName = "MyAnnotationView" //My XIB Name
let viewFromNib = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?.first as! MyAnnotationView // get My XIB
var annotationView: MyAnnotationView?
// if there is a view to be dequeued, use it for the annotation
if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) as? MyAnnotationView {
if dequeuedAnnotationView.subviews.isEmpty {
dequeuedAnnotationView.addSubview(viewFromNib)
}
annotationView = dequeuedAnnotationView
annotationView?.annotation = annotation
} else {
// if no views to dequeue, create an Annotation View
let av = MyAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
av.addSubview(viewFromNib)
annotationView = av // extend scope to be able to return at the end of the func
}
// after we manage to create or dequeue the av, configure it
if let annotationView = annotationView {
annotationView.canShowCallout = true // callout bubble
annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
annotationView.frame = CGRect(x: 0, y: 0, width: 75, height: 80)
let customView = annotationView.subviews.first as! MyAnnotationView
customView.frame = annotationView.frame
}
return annotationView
}
}
此代码输出:
很高兴为您提供帮助。
推荐阅读
- node.js - 使用 mongodb an node js 中的 where cluse 搜索对象
- java - 根据歌曲 ID 编辑歌曲艺术家姓名和歌曲名称
- terraform - 通过云教程工作的变量问题
- apex-code - 向上 SOQL 在某些领域打嗝,但在其他领域没有
- python - ndarrays的条件过滤
- sql - 制作调用它的程序日志
- python - 如何在不在python中初始化的情况下获取类对象的属性类型
- python - 如何在 Python (Pandas) 中引用受密码保护的 FTP 地址?
- huawei-mobile-services - LocationupdateEx 未提供 PRIORITY_HD_ACCURACY 数据
- javascript - 合并json数组并生成键值对