|
|
@@ -12,8 +12,12 @@ class MapAnnotationView: MKAnnotationView {
|
|
|
|
|
|
static let identifier: String = "MapAnnotationView"
|
|
|
|
|
|
- var marker: ATMapMarker?
|
|
|
- var markerImageView: MapAnnotationMarkerImageView!
|
|
|
+ var marker: ATMapMarker? {
|
|
|
+ didSet {
|
|
|
+ updateView()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var markerImageView: MapAnnotationMarkerImageView?
|
|
|
var textView: MapAnnotationMarkerTextView?
|
|
|
|
|
|
// spacing between text and image
|
|
|
@@ -24,28 +28,45 @@ class MapAnnotationView: MKAnnotationView {
|
|
|
}
|
|
|
|
|
|
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
|
|
|
- self.marker = annotation as? ATMapMarker
|
|
|
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
|
|
|
-
|
|
|
+ self.marker = annotation as? ATMapMarker
|
|
|
self.isEnabled = marker?.markerType.supportSelected ?? false
|
|
|
self.isHidden = false
|
|
|
- setupViews()
|
|
|
}
|
|
|
|
|
|
required init?(coder aDecoder: NSCoder) {
|
|
|
fatalError("init(coder:) has not been implemented")
|
|
|
}
|
|
|
|
|
|
- // MARK: - 设置视图
|
|
|
+ // MARK: - 视图更新与重用
|
|
|
+
|
|
|
+ override func prepareForReuse() {
|
|
|
+ super.prepareForReuse()
|
|
|
+ // 清除当前所有子视图
|
|
|
+ for subview in subviews {
|
|
|
+ subview.removeFromSuperview()
|
|
|
+ }
|
|
|
+ markerImageView = nil
|
|
|
+ textView = nil
|
|
|
+ }
|
|
|
|
|
|
- private func setupViews() {
|
|
|
+ private func updateView() {
|
|
|
+ // 确保在更新视图前移除所有子视图
|
|
|
+ for subview in subviews {
|
|
|
+ subview.removeFromSuperview()
|
|
|
+ }
|
|
|
+
|
|
|
+ guard let marker = marker else { return }
|
|
|
+
|
|
|
// 创建并添加图像视图
|
|
|
- markerImageView = MapAnnotationMarkerImageView(markerType: marker?.markerType ?? MarkerType.mine)
|
|
|
- markerImageView.isSelected = annotationSelected
|
|
|
- addSubview(markerImageView)
|
|
|
+ markerImageView = MapAnnotationMarkerImageView(markerType: marker.markerType)
|
|
|
+ if let markerImageView = markerImageView {
|
|
|
+ markerImageView.isSelected = annotationSelected
|
|
|
+ addSubview(markerImageView)
|
|
|
+ }
|
|
|
|
|
|
// 如果有标题,添加文本视图
|
|
|
- if let markerName = marker?.markerName, !markerName.isEmpty {
|
|
|
+ if let markerName = marker.markerName, !markerName.isEmpty {
|
|
|
textView = MapAnnotationMarkerTextView(text: markerName)
|
|
|
if let textView = textView {
|
|
|
addSubview(textView)
|
|
|
@@ -61,6 +82,8 @@ class MapAnnotationView: MKAnnotationView {
|
|
|
private func setupConstraints() {
|
|
|
// 禁用自动约束转换
|
|
|
translatesAutoresizingMaskIntoConstraints = false
|
|
|
+
|
|
|
+ guard let markerImageView = markerImageView else { return }
|
|
|
markerImageView.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
|
let markerSize = marker?.markerType.size ?? CGSize(width: 30, height: 30)
|
|
|
@@ -122,16 +145,17 @@ class MapAnnotationView: MKAnnotationView {
|
|
|
|
|
|
override func prepareForDisplay() {
|
|
|
super.prepareForDisplay()
|
|
|
- updateImage()
|
|
|
- }
|
|
|
-
|
|
|
- private func updateImage() {
|
|
|
- markerImageView.isSelected = annotationSelected
|
|
|
+ // 确保视图已经设置好
|
|
|
+ if markerImageView == nil {
|
|
|
+ updateView()
|
|
|
+ }
|
|
|
+ // 更新选中状态
|
|
|
+ markerImageView?.isSelected = annotationSelected
|
|
|
}
|
|
|
|
|
|
override func setSelected(_ selected: Bool, animated: Bool) {
|
|
|
super.setSelected(selected, animated: animated)
|
|
|
marker?.isSelected = selected
|
|
|
- updateImage()
|
|
|
+ markerImageView?.isSelected = annotationSelected
|
|
|
}
|
|
|
}
|