MapAnnotationView.swift 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //
  2. // MapAnnotationView.swift
  3. // Runner
  4. //
  5. // Created by Groot on 2025/5/9.
  6. //
  7. import UIKit
  8. import MapKit
  9. class MapAnnotationView: MKAnnotationView {
  10. static let identifier: String = "MapAnnotationView"
  11. var marker: ATMapMarker?
  12. var annotationSelected: Bool {
  13. return (marker?.isSelected ?? false) || self.isSelected
  14. }
  15. private let imageView = UIImageView()
  16. private var uiImage: UIImage? {
  17. // 先尝试从主资源束加载
  18. let imageName = marker?.markerType.imageName(selected: annotationSelected) ?? ""
  19. print(imageName)
  20. if let image = UIImage(named: imageName) {
  21. return image
  22. }
  23. // 尝试从插件资源束加载
  24. let bundleURL = Bundle(for: MapAnnotationView.self).url(forResource: "map_mapkit_ios_resources", withExtension: "bundle")
  25. if let bundleURL = bundleURL, let resourceBundle = Bundle(url: bundleURL) {
  26. return UIImage(named: imageName, in: resourceBundle, compatibleWith: nil)
  27. }
  28. return nil
  29. }
  30. override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
  31. self.marker = annotation as? ATMapMarker
  32. super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
  33. self.isEnabled = marker?.markerType.supportSelected ?? false
  34. self.isHidden = false
  35. // 添加图片显示
  36. setupImageView()
  37. }
  38. required init?(coder aDecoder: NSCoder) {
  39. fatalError("init(coder:) has not been implemented")
  40. }
  41. private func setupImageView() {
  42. // 设置默认图像
  43. imageView.image = uiImage
  44. imageView.contentMode = .scaleAspectFit
  45. // 添加图像视图到注释视图
  46. addSubview(imageView)
  47. // 设置图像视图的大小和位置
  48. let size = marker?.markerType.size ?? .init()
  49. imageView.frame = CGRect(origin: .init(), size: size)
  50. // 设置注释视图的大小
  51. self.frame = imageView.frame
  52. // 设置注释视图的中心点偏移
  53. self.centerOffset = CGPoint(x: 0, y: -imageView.frame.height / 2)
  54. }
  55. override func prepareForDisplay() {
  56. super.prepareForDisplay()
  57. // 确保图像是最新的
  58. updateImage()
  59. }
  60. private func updateImage() {
  61. let oldImage = imageView.image
  62. imageView.image = uiImage
  63. // 如果图像发生变化或为空,重新设置图像视图
  64. if imageView.image == nil || oldImage != imageView.image {
  65. setupImageView()
  66. }
  67. }
  68. override func setSelected(_ selected: Bool, animated: Bool) {
  69. super.setSelected(selected, animated: animated)
  70. if selected {
  71. self.marker?.isSelected = true
  72. } else {
  73. self.marker?.isSelected = false
  74. }
  75. // 更新图像以反映选中状态
  76. updateImage()
  77. }
  78. }