地图高级 - 自定义大头针
1. 理论支撑
按照MVC的原则
1. 每当添加一个大头针数据模型时, 地图就会调用对应的代理方法, 查找对应的大头针视图,显示在地图上;
2. 如果该方法没有实现, 或者返回nil, 那么就会使用系统默认的大头针视图
2. 模拟实现系统大头针
-
实现当添加大头针数据模型时,地图回调的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XXXAnnotation *)annotation { }
-
实现须知
1. 大头针系统对应的视图是 MKPinAnnotationView,它继承自 MKAnnotationView 2. 地图上的大头针视图,和tableview上的cell一样,都使用“循环利用”的机制
-
实现代码
// 定义缓存标识 static NSString *pinID = @"pinID"; // 缓存中取大头针 MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pinID]; // 缓存中不存在大头针,则创建 if (!pinView) { pinView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:pinID]; } // 设置模型数据 pinView.annotation = annotation; // 弹出标注 pinView.canShowCallout = YES; // 修改大头针颜色 pinView.pinColor = MKPinAnnotationColorPurple; // 设置大头针从天而降 pinView.animatesDrop = YES; // 设置大头针可以被拖拽(父类中的属性) pinView.draggable = YES; return pinView;
3. 自定义大头针
-
实现当添加大头针数据模型时,地图回调的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XXXAnnotation *)annotation
{
}
```
-
实现须知
1. 如果想要自定义大头针, 必须使用 MKAnnotationView 或者 自定义的子类 2. 但是不能直接使用系统默认的大头针, 会无效
实现代码
// 自定义大头针
static NSString *pinID = @"pinID";
MKAnnotationView *customPinView = [mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
if (!customPinView) {
customPinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinID];
}
// 设置大头针图片
customPinView.image = [UIImage imageNamed:@"category_3"];
// 设置大头针可以弹出标注
customPinView.canShowCallout = YES;
// 设置标注左侧视图
UIImageView *leftIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
leftIV.image = [UIImage imageNamed:@"huba.jpeg"];
customPinView.leftCalloutAccessoryView = leftIV;
// 设置标注右侧视图
UIImageView *rightIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
rightIV.image = [UIImage imageNamed:@"eason.jpg"];
customPinView.rightCalloutAccessoryView = rightIV;
// 设置标注详情视图(iOS9.0)
customPinView.detailCalloutAccessoryView = [[UISwitch alloc] init];
return customPinView;
4. 代理方法补充
-
选中一个大头针时调用
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
NSLog(@"选中%@", [view.annotation title]);
}
```
-
取消选中大头针时调用
-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { NSLog(@"取消选中%@", [view.annotation title]); }
5. 其他方法补充
- 添加导航条上的用户追踪按钮
navigationItem.leftBarButtonItem = MKUserTrackingBarButtonItem(mapView: mapView)
6. 测试环境
1. 加载地图数据需要联网
2. XCode版本不限
3. iOS系统版本不限
7. 常见问题总结
1. 代码运行在低版本的XCode上, 编译失败
第一: 语法错误; XCode7.0 对于OC语法优化了一些, 需要手动调整
第二: iOS9.0的SDK, 在XCode7.0之前的版本没有对应的API