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