// // MapAnnotationView.swift // Runner // // Created by Groot on 2025/5/9. // import UIKit import MapKit class MapAnnotationView: MKAnnotationView { static let identifier: String = "MapAnnotationView" var marker: ATMapMarker? var annotationSelected: Bool { return (marker?.isSelected ?? false) || self.isSelected } private let imageView = UIImageView() private var uiImage: UIImage? { // 先尝试从主资源束加载 let imageName = marker?.markerType.imageName(selected: annotationSelected) ?? "" print(imageName) if let image = UIImage(named: imageName) { return image } // 尝试从插件资源束加载 let bundleURL = Bundle(for: MapAnnotationView.self).url(forResource: "map_mapkit_ios_resources", withExtension: "bundle") if let bundleURL = bundleURL, let resourceBundle = Bundle(url: bundleURL) { return UIImage(named: imageName, in: resourceBundle, compatibleWith: nil) } return nil } override init(annotation: MKAnnotation?, reuseIdentifier: String?) { self.marker = annotation as? ATMapMarker super.init(annotation: annotation, reuseIdentifier: reuseIdentifier) self.isEnabled = marker?.markerType.supportSelected ?? false self.isHidden = false // 添加图片显示 setupImageView() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func setupImageView() { // 设置默认图像 imageView.image = uiImage imageView.contentMode = .scaleAspectFit // 添加图像视图到注释视图 addSubview(imageView) // 设置图像视图的大小和位置 let size = marker?.markerType.size ?? .init() imageView.frame = CGRect(origin: .init(), size: size) // 设置注释视图的大小 self.frame = imageView.frame // 设置注释视图的中心点偏移 self.centerOffset = CGPoint(x: 0, y: -imageView.frame.height / 2) } override func prepareForDisplay() { super.prepareForDisplay() // 确保图像是最新的 updateImage() } private func updateImage() { let oldImage = imageView.image imageView.image = uiImage // 如果图像发生变化或为空,重新设置图像视图 if imageView.image == nil || oldImage != imageView.image { setupImageView() } } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if selected { self.marker?.isSelected = true } else { self.marker?.isSelected = false } // 更新图像以反映选中状态 updateImage() } }