如何在mapView更改时刷新MKOverlayRenderer

我是新来的代码,我试图实现像提醒应用程序的东西:

在这里输入图像说明

我已经按照另一个答案来实现它

在这里我的代码:

在我的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() } } 

感谢您的任何想法,

这里用户移动地图时没有缩放的结果图像:

在这里输入图像说明

MapKit通过tile调用你的渲染器。 为了找出渲染的tile(以'MKMapRect'表示),它会询问MKOverlay渲染器是否在该tile上渲染。

MKCircle很可能是以某种方式实现的,只会对那些包含你的圈子的瓦片说yes。

所以你需要重写var boundingMapRect: MKMapRect { get }来返回MKMapRectWorld或覆盖optional func intersectsMapRect(_ mapRect: MKMapRect) -> Bool of MKCircle

然后,您的渲染器被调用以显示给用户的每个图块。

由于MKCircle主要是围绕圆圈计算矩形,并检查矩形是否与矩形相交,所以最好实现自己的MKOverlay只需返回MKMapRectWorld作为其boundingMapRec