iOS原生地图MKMapView添加半透明遮盖物

题外话

关于地图使用的大神文章有很多在此不做讲解了,此处仅探讨关于iOS原生地图MKMapView添加半透明遮盖物,遮盖轨迹起点、终点等自定义annotation视图的方法。
由于我参与开发的项目中有用到地图展示功能,而地图各种标志和线路显示的颜色,不容易突出显示的路程轨迹线颜色 MKPolyColorline ;为了爬梯翻墙各种看大神的资料和讲解,走了很多弯路终于搞定,在此记录下。这里我用的是MapKit的MKCircle。使用方法很简单,但要注意很多细节。

效果图

IMG_E40678CB5702-1.jpeg

Step 1

    // 1. 创建一个圆形覆盖层对象
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake(39.905, 116.398) radius:100000000];
    //  将单个的覆盖层添加到指定的层级
    [self.mapView addOverlay:circle level:MKOverlayLevelAboveLabels];

    // 2. 行程轨迹线
    MKPolyColorline *lineOne = [MKPolyColorline polylineWithCoordinates:pointsToUse count:[routes count]];
    lineOne.lineColor = lineColor;
    [self.mapView.mapView addOverlay:lineOne];

此处首先实例化创建一个MKCircle对象,这个是苹果给的官方API,顾名思义实际上是画一个圆形的图层,所以需要传两个参数:
1,CLLocationCoordinate2D :经纬坐标,以此为MKCircle的中心点
2,CLLocationDistance :radius,半径,即为MKCircle的半径

行程轨迹线在此不做探讨

大坑注意:

添加MKCircle图层一定要在行程轨迹线MKPolyColorline图层之前,否则轨迹线会被MKCircle图层所遮盖

Step 2

// 方法 1
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id )overlay
{
    if ([overlay isKindOfClass:[MKPolyColorline class]]) { //轨迹路线
        MKPolyColorline *overColorlay = (MKPolyColorline *)overlay;
        MKPolylineView *lineview=[[MKPolylineView alloc] initWithOverlay:overColorlay] ;
        //路线颜色
        lineview.strokeColor = kColorRGBHex(0x7FFF00);
        lineview.lineWidth = 9.0;
        return lineview;
    }
    else if ([overlay isKindOfClass:[MKCircle class]]) { //覆盖图层
        MKCircle *circle = (MKCircle *)overlay;
        // iOS7之后,推荐使用MKXxxRenderer来负责渲染覆盖层控件
        MKCircleRenderer *circleRend = [[MKCircleRenderer alloc] initWithCircle:circle];
        circleRend.alpha = 0.3;
        //  填充颜色
        circleRend.fillColor = [UIColor blackColor];
        //  边框颜色
        //    circleRend.strokeColor = [UIColor redColor];
        
        return circleRend;
    }
    return nil;
}
// 方法 2
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id )overlay
{
    if ([overlay isKindOfClass:[MKPolyColorline class]]) { //轨迹路线
        MKPolyColorline *overColorlay = (MKPolyColorline *)overlay;
        MKPolylineView *lineview=[[MKPolylineView alloc] initWithOverlay:overColorlay] ;
        //路线颜色
        lineview.strokeColor = kColorRGBHex(0x7FFF00);
        lineview.lineWidth = 9.0;
        return lineview;
    }
    else if ([overlay isKindOfClass:[MKCircle class]]) { //覆盖图层
        MKCircle *circle = (MKCircle *)overlay;
        // iOS7之后,推荐使用MKXxxRenderer来负责渲染覆盖层控件
        MKCircleRenderer *circleRend = [[MKCircleRenderer alloc] initWithCircle:circle];
        circleRend.alpha = 0.3;
        //  填充颜色
        circleRend.fillColor = [UIColor blackColor];
        //  边框颜色
        //    circleRend.strokeColor = [UIColor redColor];
        
        return circleRend;
    }
    return nil;
}

小坑注意

方法1或者方法2 都是MKMapView的代理方法,随便使用一个均可,若使用方法1则不会执行方法2,原因不得而知,如有大神指导的,还望不吝赐教。但有一点注意:不论选择哪种代理方法,一定要return轨迹线图层MKPolyColorline和覆盖层控件MKCircle。

你可能感兴趣的:(iOS原生地图MKMapView添加半透明遮盖物)