2015-05-30 75 views
2

我是新來的代碼,我試圖實現類似的提醒應用:如何刷新MKOverlayRenderer當MapView的變化

enter image description here

我已經跟着另一個answer意識到這一點,並

這裏我的代碼:

在我的ViewController:

var circle = MKCircle(centerCoordinate: location.coordinate, radius: 100) 
self.mapView.addOverlay(circle) 

在我的MKMapView:

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { 

    if overlay is MKCircle 
    { 
     render = MapFillRenderer(overlay: overlay) 
     return render 
    } else { 
     return nil 
    } 
} 

而且MapFillRenderer(MKOverlayRenderer的子類):

class MapFillRenderer: MKOverlayRenderer { 

    var colorIn: UIColor 
    var colorOut: UIColor 

    override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext!) { 
     // Fill full map rect with some color. 
     var rect = self.rectForMapRect(mapRect) 
     CGContextSaveGState(context); 
     CGContextAddRect(context, rect); 
     CGContextSetFillColorWithColor(context, colorOut.CGColor) 
     CGContextFillRect(context, rect); 
     CGContextRestoreGState(context); 

     // Clip rounded hole. 
     CGContextSaveGState(context); 
     CGContextSetFillColorWithColor(context, colorIn.CGColor); 
     CGContextSetBlendMode(context, kCGBlendModeClear); 
     CGContextFillEllipseInRect(context, self.rectForMapRect(self.overlay.boundingMapRect)) 
     CGContextRestoreGState(context); 

     // Draw circle 
     super.drawMapRect(mapRect, zoomScale: zoomScale, inContext: context) 
    } 
} 

問題:

但是我有一個問題,當用戶移動地圖時,主掩碼不會刷新,並且不會填充所有地圖區域。 值得注意的是,它刷新,但只有當我縮小足夠。 如何在用戶移動地圖時強制刷新而不縮小? 我已經嘗試,但它失敗:

func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) { 
    if render.overlay != nil { 
     render.setNeedsDisplay() 
    } 
} 

感謝您的任何想法,

這裏結果的圖像時,用戶移動地圖,而縮放:

enter image description here

+0

注意:提醒Apple應用程序,當您爲位置添加提醒時,具有相同的錯誤 – grominet

回答

3

MapKit通過平鋪調用您的渲染器。爲了找出渲染的tile(用'MKMapRect'表示),它會詢問MKOverlay渲染器是否在該tile上渲染。

MKCircle很可能以一種方式實現,只會對那些包含您的圈子的瓦片說yes。

因此,您需要覆蓋var boundingMapRect: MKMapRect { get }以返回MKMapRectWorld或覆蓋MKCircleoptional func intersectsMapRect(_ mapRect: MKMapRect) -> Bool

然後,您的渲染器會針對顯示給用戶的每個圖塊調用。

由於MKCircle主要是關於計算繞了一圈矩形和檢查,如果瓷磚將與矩形相交,它可能是更好地實現自己的MKOverlay剛剛返回MKMapRectWorldboundingMapRec