gpt4 book ai didi

ios - 带有折线或注释的 MapView 在缩放时丢失图 block

转载 作者:可可西里 更新时间:2023-11-01 02:16:19 25 4
gpt4 key购买 nike

我在 IOS 应用程序中有一个 MKMapView,它使用缓存的本 map block ,效果很好。可以缩放、四处移动等...

但是,当我添加注释或多段线时,它仍然可以正常工作,直到缩放达到某个缩放级别,然后注释和多段线下的图 block 不会显示,但其他所有都可以。

zoomed out at the right level

Zoomed in one two many levels.

如果我删除注释/线条, map 会正确放大,并且对于注释/线条所在的区域效果很好。

有什么想法吗?

我将其简化为最小的测试用例。这运行良好,直到您放大,然后多段线下的所有图 block 都消失了。缩小它们会重新出现。

import Foundation
import UIKit
import MapKit

class MyController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
var overlay:MKTileOverlay = MKTileOverlay(URLTemplate: "https://services.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}.jpg");

override func viewDidLoad() {
mapView.delegate = self
mapView.showsUserLocation = true;
overlay.maximumZ = 15;
overlay.minimumZ = 12;
overlay.canReplaceMapContent = true
mapView.addOverlay(overlay)

var points: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]()

points.append(CLLocationCoordinate2D(latitude: 40.7608, longitude: -111.8910));
points.append(CLLocationCoordinate2D(latitude: 40.8894, longitude: -111.8808));

var polyline = MKPolyline(coordinates: &points, count: points.count)
mapView.addOverlay(polyline)
let region = MKCoordinateRegion(center: points[0], span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
mapView.setRegion(region, animated: false)
}


func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
if overlay is MKPolyline {
var polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = UIColor.blueColor()
polylineRenderer.lineWidth = 5
return polylineRenderer
} else if (overlay is MKTileOverlay) {
let renderr = MKTileOverlayRenderer(overlay: overlay)
return renderr
}

return nil
}
}

最佳答案

我看到你提出这个问题已经三个月了,但如果仍然有人感兴趣,我会分享我的发现。

我添加了使用 MKMapSnapshotter 从 Apple 下载 map 图 block 的功能,并将它们存储到一组图 block 目录中,以便在您离开蜂窝服务区域时使用,效果非常好。根据 iOS 标准,目录涵盖 3 到 6 个不同的缩放级别,具体取决于用户选择,平铺图像排列在以缩放级别命名的目录下的子目录中。

当使用 MKTileOverlayRenderer 显示这些图像时,它会在我为 MKTileOverlay 对象设置的 MKMapRectMake 中指定的最小和最大缩放级别之间适本地切换图像缩放级别。

map 以所有指定的缩放级别适本地显示所有图 block ,并随着大小的变化重新绘制图 block 。当显示高于最大或低于最小缩放级别时,它会继续显示最大或最小缩放级别的图 block 一段时间,因为它没有新尺寸的图 block 图像。当没有多段线时,这可以正常工作,但系统会重新绘制位于多段线下方的正方形以调整线条的大小,当它这样做时,它会清除图 block 图像并寻找新缩放级别的图 block 。由于它没有这些图 block ,因此这些方 block 在图 block 级别上最终为空,但未被多段线重叠的方 block 不会被清除,因此会保留旧图像。

顺便说一句,您可能已经遇到过这种情况,但如果您还没有遇到过,则需要子类化 MKTileOverlay,以便您可以设置由图 block 映射的区域的位置和大小。

希望所有这些都有助于解释事情,即使它不一定能解决你想做什么的问题。

关于ios - 带有折线或注释的 MapView 在缩放时丢失图 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38193025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com