2 Комити 9560dc1b45 ... d0e402e68f

Аутор SHA1 Порука Датум
  “HeShaoZe” d0e402e68f Merge branch 'v1.1.0' into v1.1.0-iOS пре 4 месеци
  “HeShaoZe” 36477ca375 fix: 优化移动至多个点的位置,并提供设置padding距离的方法闪退的问题。 пре 4 месеци
1 измењених фајлова са 51 додато и 13 уклоњено
  1. 51 13
      plugins/map_mapkit_ios/ios/Classes/MapView/Extension/MapKit+E.swift

+ 51 - 13
plugins/map_mapkit_ios/ios/Classes/MapView/Extension/MapKit+E.swift

@@ -96,34 +96,72 @@ extension MKMapView {
         let spanLat = (maxLat - minLat) * 1.1  // 增加10%的边距
         let spanLng = (maxLng - minLng) * 1.1
         
-        // 确保跨度不为0
-        let span = MKCoordinateSpan(
-            latitudeDelta: max(spanLat, 0.001),  // 设置最小跨度,避免点过于集中时视图缩放过度
-            longitudeDelta: max(spanLng, 0.001)
-        )
+        // 确保跨度不为0且不过大
+        let safeSpanLat = max(min(spanLat, 100.0), 0.001)  // 设置合理的最大跨度
+        let safeSpanLng = max(min(spanLng, 100.0), 0.001)
+        
+        // 创建初始区域
+        let span = MKCoordinateSpan(latitudeDelta: safeSpanLat, longitudeDelta: safeSpanLng)
+        print("初始区域: center=\(center), span=\(span)")
         
         // 3. 创建区域并应用padding
         var region = MKCoordinateRegion(center: center, span: span)
         
         // 应用padding(如果有)
         if let padding = padding {
-            // 计算padding对应的经纬度差值
-            let mapViewWidth = self.bounds.width
-            let mapViewHeight = self.bounds.height
+            // 检查地图视图尺寸是否有效
+            let mapViewWidth = max(self.bounds.width, 1.0)  // 确保宽度至少为1
+            let mapViewHeight = max(self.bounds.height, 1.0)  // 确保高度至少为1
             
             // 基于地图视图尺寸和padding计算经纬度调整量
             let latPadding = span.latitudeDelta * (padding.top + padding.bottom) / mapViewHeight
             let lngPadding = span.longitudeDelta * (padding.left + padding.right) / mapViewWidth
             
-            // 调整区域跨度以应用padding
-            region.span.latitudeDelta += latPadding
-            region.span.longitudeDelta += lngPadding
+            // 调整区域跨度以应用padding,并确保不会导致无穷大
+            region.span.latitudeDelta = min(region.span.latitudeDelta + latPadding, 180.0)
+            region.span.longitudeDelta = min(region.span.longitudeDelta + lngPadding, 360.0)
+            
+            print("应用padding后的区域: span=\(region.span)")
         }
         
-        // 4. 设置地图区域
-        // 使用animate参数控制是否动画过渡
+        // 4. 验证最终区域是否有效
+        if !isValidRegion(region) {
+            //print("无效区域,使用默认区域")
+            region = defaultRegion()
+        }
+        
+        print("最终使用的区域: \(region)")
+        
+        // 设置地图区域
         self.setRegion(self.regionThatFits(region), animated: true)
     }
+
+    // 辅助方法:检查区域是否有效
+    private func isValidRegion(_ region: MKCoordinateRegion) -> Bool {
+        let center = region.center
+        let span = region.span
+        
+        return !center.latitude.isNaN && !center.longitude.isNaN &&
+               !span.latitudeDelta.isNaN && !span.longitudeDelta.isNaN &&
+               !span.latitudeDelta.isInfinite && !span.longitudeDelta.isInfinite &&
+               isValidCoordinate(center) &&
+               span.latitudeDelta > 0 && span.latitudeDelta <= 180 &&
+               span.longitudeDelta > 0 && span.longitudeDelta <= 360
+    }
+
+    // 辅助方法:提供默认有效区域
+    private func defaultRegion() -> MKCoordinateRegion {
+        return MKCoordinateRegion(
+            center: CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194),
+            span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
+        )
+    }
+
+    // 辅助方法:检查坐标是否有效
+    private func isValidCoordinate(_ coordinate: CLLocationCoordinate2D) -> Bool {
+        return coordinate.latitude >= -90 && coordinate.latitude <= 90 &&
+               coordinate.longitude >= -180 && coordinate.longitude <= 180
+    }
     
     ///是否隐藏地图图标
     func mapLogoVisible(isHiddenLogo : Bool) {