|
|
@@ -0,0 +1,68 @@
|
|
|
+//
|
|
|
+// MapKit+E.swift
|
|
|
+// Pods
|
|
|
+//
|
|
|
+// Created by Groot on 2025/5/14.
|
|
|
+//
|
|
|
+
|
|
|
+import MapKit
|
|
|
+import Foundation
|
|
|
+
|
|
|
+extension MKMapView {
|
|
|
+ // 按比例 按padding适应annotation
|
|
|
+ public func fitsAllPoints(
|
|
|
+ points: [MKMapPoint],
|
|
|
+ padding: UIEdgeInsets,
|
|
|
+ aspectRatio: Double? = nil,
|
|
|
+ animated: Bool = true
|
|
|
+ ) {
|
|
|
+ var zoomRect: MKMapRect = .null
|
|
|
+ for point in points {
|
|
|
+ let pointRect = MKMapRect(x: point.x, y: point.y, width: 0, height: 0)
|
|
|
+ if zoomRect.isNull {
|
|
|
+ zoomRect = pointRect
|
|
|
+ } else {
|
|
|
+ zoomRect = zoomRect.union(pointRect)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Calculate the desired size based on the aspect ratio
|
|
|
+ let aspectRatio = aspectRatio ?? 1.0
|
|
|
+ let width = zoomRect.size.width
|
|
|
+ let height = zoomRect.size.height
|
|
|
+ let desiredWidth = max(width, height * aspectRatio)
|
|
|
+ let desiredHeight = max(height, width / aspectRatio)
|
|
|
+
|
|
|
+ // Calculate the center of the annotations
|
|
|
+ let center = MKMapPoint(x: zoomRect.midX, y: zoomRect.midY)
|
|
|
+
|
|
|
+ // Create a new MKMapRect with the desired aspect ratio and centered on the annotations
|
|
|
+ let newMapRect = MKMapRect(
|
|
|
+ x: center.x - desiredWidth / 2,
|
|
|
+ y: center.y - desiredHeight / 2,
|
|
|
+ width: desiredWidth,
|
|
|
+ height: desiredHeight
|
|
|
+ )
|
|
|
+ setVisibleMapRect(newMapRect, edgePadding: padding, animated: animated)
|
|
|
+ }
|
|
|
+
|
|
|
+ func calculateMapRect(points: [MKMapPoint], padding: UIEdgeInsets = .zero) -> MKMapRect {
|
|
|
+ var zoomRect: MKMapRect = .null
|
|
|
+ for point in points {
|
|
|
+ let pointRect = MKMapRect(x: point.x, y: point.y, width: 0, height: 0)
|
|
|
+ if zoomRect.isNull {
|
|
|
+ zoomRect = pointRect
|
|
|
+ } else {
|
|
|
+ zoomRect = zoomRect.union(pointRect)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return mapRectThatFits(zoomRect, edgePadding: padding)
|
|
|
+ }
|
|
|
+
|
|
|
+ func takeSnapShot(option: MKMapSnapshotter.Options, completion: @escaping (MKMapSnapshotter.Snapshot?) -> Void) {
|
|
|
+ let shotter = MKMapSnapshotter(options: option)
|
|
|
+ shotter.start(with: .global()) { shot, _ in
|
|
|
+ completion(shot)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|