最後に私はそれを理解しました。実際、オーバーレイは更新されません。setNeedsDisplayInMapRect
が原因ではありません。いくつかのチェックの後、私はsetNeedsDisplayInMapRect
が実際にdrawMapRect:zoomScale:inContext:
の実行を引き起こしていることを発見しましたが、何とかデフォルトの再描画によって同じタイルイメージが生成されます。私はこれがMKTileOverlayRenderの内部キャッシュのためかもしれないと思います。
私のためのソリューションはMKTileOverlayRender
をサブクラス化することで、新しいクラスで:
override func canDrawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale) -> Bool {
let tilePath = self.tilePathForMapRect(mapRect, andZoomScale: zoomScale)
let tilePathString = stringForTilePath(tilePath)
if let _ = self.cache.objectForKey(tilePathString) {
return true
} else {
let tileOverlay = self.overlay as! MKTileOverlay
tileOverlay.loadTileAtPath(tilePath, result: {
data, error in
if error == nil && data != nil {
if let image = UIImage(data: data!) {
self.cache.setObject(image, forKey: tilePathString)
self.setNeedsDisplayInMapRect(mapRect, zoomScale: zoomScale)
}
}
})
return false
}
}
override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext) {
let tilePath = self.tilePathForMapRect(mapRect, andZoomScale: zoomScale)
let tilePathString = stringForTilePath(tilePath)
if let image = self.cache.objectForKey(tilePathString) as? UIImage {
CGContextDrawImage(context, self.rectForMapRect(mapRect), image.CGImage)
} else {
super.setNeedsDisplayInMapRect(mapRect, zoomScale: zoomScale)
}
self.cache.removeObjectForKey(tilePathString)
}
このことができますかどうかを確認:http://stackoverflow.com/questions/10128447/setneedsdisplayinmaprect-doesnt-trigger-newを-drawmaprect-call – user1046037
ありがとうございます。私はこの記事で述べたアプローチを試しました。それらのどれも私のために働かない。 –