|
|
@@ -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) {
|