如何在mapView更改

时间:2015-05-30 09:15:27

标签: ios swift mapkit mkoverlay

我是代码新手,我正在尝试实现像Reminders app这样的东西:

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

1 个答案:

答案 0 :(得分:3)

MapKit通过tile调用渲染器。要确定要渲染哪些图块(以' MKMapRect' s表示),它会询问MKOverlay您的渲染器是否将在该图块上渲染。

MKCircle很可能是以一种方式实现的,只会对包含你的圆圈的那些瓷砖说“是”。

因此,您需要覆盖var boundingMapRect: MKMapRect { get }以返回MKMapRectWorld或覆盖optional func intersectsMapRect(_ mapRect: MKMapRect) -> Bool的{​​{1}}。

然后为每个显示给用户的图块调用渲染器。

由于MKCircle主要是计算围绕圆圈的矩形并检查图块是否与该矩形相交,因此最好实现自己的MKCircle只返回MKOverlay作为其{{1} }}