2016-07-04 60 views
2

瓷磚我使用的偉大工程的緩存局部區塊擁有的MKMapView在iOS應用程序。可以縮放,移動等...的MapView與折線或註釋丟失的變焦

但是,當我添加註釋或多段線時,它仍然很好,直到縮放達到某個縮放級別,然後註釋和多義線下的塊不會出現,但所有其他人都很好。

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

回答

1

我發現自你提出這個問題已經三個月了,但如果它仍然有興趣,我會分享我發現的。

我已經加入到使用MKMapSnapshotter從蘋果公司下載地圖圖塊,並將它們存儲爲一組瓦片目錄的使用,當你出門在外手機服務領域,這工作得很好的能力。根據用戶的選擇,這些目錄覆蓋3到6個不同的縮放級別,根據iOS標準,平鋪圖像排列在子目錄下以其縮放級別命名的目錄下。

使用MKTileOverlayRenderer顯示這些圖像時,它會在MKMapRectMake中爲MKTileOverlay對象設置的最小和最大縮放級別之間的縮放級別之間進行適當切換。

的地圖顯示所有拼貼的適當在所有指定的縮放級別,重新油漆瓦片大小而改變。當顯示器高於最低或最低縮放級別時,由於它沒有新尺寸的平鋪圖像,它會繼續顯示來自最大或最小縮放級別的圖塊一段時間。當沒有折線此工程確定,但系統重繪,根據折線騙調整線平方,當它這樣做,它會清除平鋪圖像和找磚爲新的縮放級別。由於它沒有這些瓷磚,這些方塊會在瓷磚層面上空蕩蕩的,儘管未疊加多邊形的方塊不會被清除,因此保留舊圖像。

順便說一句,你可能已經遇到了這個問題,但如果你還沒有,你需要繼承MKTileOverlay,這樣你才能設置貼圖映射區域的位置和大小。

希望所有這一切都有助於解釋事情,即使它並不一定能解決的,你會想做些什麼什麼問題。