地图视图的自定义注释 Swift
Custom Annotation for Mapview Swift
我查看了相关帖子,但仍然没有收到自定义图钉....
自定义注释 --> 这包括设置我的图像
import UIKit
import MapKit
class CustomPointAnnotation: MKPointAnnotation {
var pinCustomImageName: UIImage!
}
视图控制器:
我想return当前位置,直到选择一个按钮来放置图钉
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
//current Location
if !(annotation is CustomPointAnnotation) {
return nil
}
let reuseIdentifier = "pin"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)
if annotationView == nil {
annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
annotationView!.canShowCallout = true
} else {
annotationView!.annotation = annotation
}
if let annotationView = annotationView {
annotationView.image = UIImage(named: "Skyscraper")
annotationView.canShowCallout = true
}
return annotationView
}
func addPin() {
pointAnnotation = CustomPointAnnotation()
pointAnnotation.pinCustomImageName = UIImage(named: "Skyscraper")
pointAnnotation.coordinate = currentLocation.coordinate
pointAnnotation.title = "First Building"
pointAnnotation.subtitle = "Latitude: \(currentLocation.coordinate.latitude), \
(currentLocation.coordinate.longitude)"
mapView.addAnnotation(pointAnnotation)
}
代码没有严重错误。但是可能有一些事情会导致问题,包括:
您是否为地图视图设置了 delegate
(在 IB 中或以编程方式)?否则,您的 mapView(_:viewFor:)
将永远不会被调用。添加断点或调试print
语句确认。
您确认 UIImage(named: "Skyscraper")
正在成功检索图像吗?确保这不会返回 nil
.
注意,如果只是iOS11及以后的版本,可以稍微简化一下这段代码。自 iOS 11 以来,我们不再需要 mapView(_:viewFor:)
在这样的简单场景中。我建议将注释视图配置代码放在注释视图 subclass 中,并避免使用 viewFor
实现使我们的视图控制器混乱。
因此,当您确实解决了当前问题时,建议的流程是:
为您的注释和注释视图定义 classes:
class CustomAnnotation: MKPointAnnotation {
var pinCustomImage: UIImage!
}
和
class CustomAnnotationView: MKAnnotationView {
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
canShowCallout = true
update(for: annotation)
}
override var annotation: MKAnnotation? { didSet { update(for: annotation) } }
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func update(for annotation: MKAnnotation?) {
image = (annotation as? CustomAnnotation)?.pinCustomImage
}
}
在viewDidLoad
注册这个注解视图class:
mapView.register(CustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
删除 mapView(_:viewFor:)
实现。
现在,当您将 CustomAnnotation
添加到地图的注释列表时,它会正确呈现。
但我建议先解决您当前的问题。在解决这些更基本的问题之前,没有必要改进您的实施。
我查看了相关帖子,但仍然没有收到自定义图钉....
自定义注释 --> 这包括设置我的图像
import UIKit
import MapKit
class CustomPointAnnotation: MKPointAnnotation {
var pinCustomImageName: UIImage!
}
视图控制器:
我想return当前位置,直到选择一个按钮来放置图钉
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
//current Location
if !(annotation is CustomPointAnnotation) {
return nil
}
let reuseIdentifier = "pin"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)
if annotationView == nil {
annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
annotationView!.canShowCallout = true
} else {
annotationView!.annotation = annotation
}
if let annotationView = annotationView {
annotationView.image = UIImage(named: "Skyscraper")
annotationView.canShowCallout = true
}
return annotationView
}
func addPin() {
pointAnnotation = CustomPointAnnotation()
pointAnnotation.pinCustomImageName = UIImage(named: "Skyscraper")
pointAnnotation.coordinate = currentLocation.coordinate
pointAnnotation.title = "First Building"
pointAnnotation.subtitle = "Latitude: \(currentLocation.coordinate.latitude), \
(currentLocation.coordinate.longitude)"
mapView.addAnnotation(pointAnnotation)
}
代码没有严重错误。但是可能有一些事情会导致问题,包括:
您是否为地图视图设置了
delegate
(在 IB 中或以编程方式)?否则,您的mapView(_:viewFor:)
将永远不会被调用。添加断点或调试print
语句确认。您确认
UIImage(named: "Skyscraper")
正在成功检索图像吗?确保这不会返回nil
.
注意,如果只是iOS11及以后的版本,可以稍微简化一下这段代码。自 iOS 11 以来,我们不再需要 mapView(_:viewFor:)
在这样的简单场景中。我建议将注释视图配置代码放在注释视图 subclass 中,并避免使用 viewFor
实现使我们的视图控制器混乱。
因此,当您确实解决了当前问题时,建议的流程是:
为您的注释和注释视图定义 classes:
class CustomAnnotation: MKPointAnnotation { var pinCustomImage: UIImage! }
和
class CustomAnnotationView: MKAnnotationView { override init(annotation: MKAnnotation?, reuseIdentifier: String?) { super.init(annotation: annotation, reuseIdentifier: reuseIdentifier) canShowCallout = true update(for: annotation) } override var annotation: MKAnnotation? { didSet { update(for: annotation) } } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func update(for annotation: MKAnnotation?) { image = (annotation as? CustomAnnotation)?.pinCustomImage } }
在
viewDidLoad
注册这个注解视图class:mapView.register(CustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
删除
mapView(_:viewFor:)
实现。
现在,当您将 CustomAnnotation
添加到地图的注释列表时,它会正确呈现。
但我建议先解决您当前的问题。在解决这些更基本的问题之前,没有必要改进您的实施。