美文网首页MKMapKit
iOS原生地图MKMapView添加半透明遮盖物

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

作者: luckySmileBoy | 来源:发表于2020-06-12 18:03 被阅读0次

    题外话

    关于地图使用的大神文章有很多在此不做讲解了,此处仅探讨关于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 <MKOverlay>)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 <MKOverlay>)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添加半透明遮盖物

        本文链接:https://www.haomeiwen.com/subject/jdtwkftx.html