| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- //
- // 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()
- }
- }
|