【问题标题】:MapView with Polyline or Annotation losing tile on zoom带有折线或注释的 MapView 在缩放时丢失图块
【发布时间】:2016-07-04 22:38:45
【问题描述】:

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

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

zoomed out at the right level

Zoomed in one two many levels.

如果我删除注释/线条,地图会正确放大,并且非常适合注释/线条所在的区域。

有什么想法吗?

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

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
}
}

【问题讨论】:

    标签: ios swift mkmapview


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2011-03-09
      相关资源
      最近更新 更多