直接贴出关键代码,这段代码放在viewDidLoad里面,主要做了几件事,初始化解编码对象,初始化地址管理器,初始化地图视图,把地图视图加入到界面上去。
注意地图视图设置了代理
如何设置地图初始化地图位置呢?
假如你想在地图上添加按钮,自定义视图啥的功能如何做呢?
假如你要向地图中添加大头针呢?
假如你想向地图中添加多边形视图呢?
第一步中我们在地图视图中设置了代理,会走如下代理去
1.当我们添加的是多边形到地图上的时候会走下面的代理,关于添加的到底是多边形还是大头针上面两步就决定了:
当我们添加的是大头针的时候,会走如下的代理:
上面的代码,第一种 if 情况是,我们设置为用户实时定位的时候用的
第二种 if 就是普通的大头针
第三种 if 就是用户自定义的大头针
注意一点,CalloutAnnotation就是实现了协议MKAnnotation的对象。具体如下
关于这个set as Delivery Zone视图的类,我也贴出来:
大致的思路就是从底边中间开始画一个箭头的形状的粗线条环绕在大头针视图上
选中大头针之后呢?(注意选中多边形不会走这个方法,这个仅仅是选中大头针,之后添加一个自定义视图才走这里)
有几个概念需要明确:
MKAnnotationView 是一个显示在mapview上的大头针视图,他包含一些大头针的展示在界面的信息,比如图片,大头针偏移量,左右附件。
MKAnnotation 是用来初始化MKAnnotationView的对象,他包含一些大头针视图展示的信息比如:标题,副标题,经纬度。
大致思路呢?
首先显示的有:地图,大头针,详细大头针自定义视图,或者 地图,多边形,详细多边形自定义视图。
所以,大致思路是:
1.假如是大头针的话,我们首先弄到所有的大头针,然后添加到数组中,再把这个数组全部加到mapview中去,
这他mapview就会走它的创建大头针代理方法。因此地图上布满了大头针标记。
假如这时候我们需要显示一个初始的自定义视图上,那么我们只需要
MKPointAnnotation *annotation = [[_mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.subtitle == %@",[_storesByDistrict[indexPath.row] nbr]]] firstObject];
[_mapView selectAnnotation:annotation animated:YES];
这样他就类似于表格初始化就选中一个行一样,他会自定一出现就显示一个自定义视图在大头针上,那么问题来了,我们怎么做到的?
其实我们会走入这个代理方法:
这个地方最后一步就往mapview中添加了一个,自定义的CalloutAnnotation对象
注意:@interface CalloutAnnotation : NSObject<MKAnnotation>
因为地图又新增了自定义大头针,然后他就会走到:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
这样我们只需要在里面加一个判断:
} else if ([annotation isKindOfClass:[CalloutAnnotation class]]) {
假如是这个自定义的大头针,我们就自定义个视图
注意: @interface CustomCalloutView : MKAnnotationView
最后在自定义的视图上面添加乱七八糟的东西,就好了!搞定了
大致执行顺序呢?
大致就是,我们往mapview中添加MKAnnotation对象或者实现这个MKAnnotation协议的对象,
然后mapview的代理就走到
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
然后我们再他里面返回一个MKAnnotationView对象或者MKAnnotationView的子类对象(即自定义视图)
然后就好了。
以上讲的都是关于非多边形页面
至于多边形,就是添加多边形MKPolygon对象,然后就会走mapview的代理
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay
然后我们给他设置一些多边形的边界颜色,内部颜色,就出现了上面图里的不同颜色多边形
至于选择之后显示一个自定义视图,我们发现他不会走mapview的方法
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
所以最后用touch做的
大致也是取到点击的区域,在哪里,之后
往地图上添加MKAnnotation对象,然后在走到
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
然后也类似之前分析的大头针模式