自定义大头针
#import
#import
//1.导入框架 2.遵循协议 3.拷贝属性
@interface MyAnnotation : NSObject
//大头针的经纬度
@property (nonatomic) CLLocationCoordinate2D coordinate;
//大头针的标题
@property (nonatomic, copy) NSString *title;
//大头针的子标题
@property (nonatomic, copy) NSString *subtitle;
@end
使用大头针
//创建大头针
MyAnnotation *annotation = [[MyAnnotation alloc] init];
//设置属性
//位置
annotation.coordinate = CLLocationCoordinate2DMake(38, 114);
//标题
annotation.title = @"标题";
//子标题
annotation.subtitle = @"子标题";
//将大头针添加到地图
[self.mapView addAnnotation:annotation];
点击添加大头针
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//1.获取用户点击的位置
CGPoint point = [[touches anyObject] locationInView:self.mapView];
//2.将位置转换成经纬度
CLLocationCoordinate2D coordinate = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
//3.反地理编码获取地标
//3.1创建反地理编码对象
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
//3.2将经纬度转换为位置
CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
//3.3反地理编码
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {
if(error){
NSLog(@"%@",error);
return ;
}
//4.添加大头针 设置属性
//4.1获取地标
CLPlacemark *placemark = placemarks[0];
//4.2创建大头针
MyAnnotation *annotation = [[MyAnnotation alloc] init];
annotation.coordinate = coordinate;//经纬度
annotation.title = placemark.locality;//城市名
annotation.subtitle = placemark.name;//具体地名
dispatch_async(dispatch_get_main_queue(), ^{
//4.3添加到地图
[self.mapView addAnnotation:annotation];
});
}];
}
自定义大头针颜色和动画
//设置地图代理
self.mapView.delegate = self;
//遵守协议
#pragma mark - MKMapViewDelegate
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{
//获取ID
static NSString *ID = @"annotation";
#pragma mark - 获取大头针
//获取大头针
//MKAnnotationView:默认没有界面
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
//判断并创建大头针
if(annotationView == nil) {
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
}
#pragma mark - 设置颜色
//设置大头针颜色 只有三种颜色
//annotationView.pinColor = MKPinAnnotationColorGreen;
annotationView.pinTintColor = [UIColor yellowColor];
#pragma mark - 设置掉落效果
//设置动画掉落效果
annotationView.animatesDrop = YES;
#pragma mark - 显示标题和子标题
//自定义大头针后.默认不会显示标题和子标题
//调出标题和子标题
annotationView.canShowCallout = YES;
#pragma mark - 设置大头针界面
//如果没有设置标题 以下代码全部失效
//左边界面
annotationView.leftCalloutAccessoryView = [[UISwitch alloc] init] ;
//右边界面
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
//中间界面 会覆盖大头针的子标题
annotationView.detailCalloutAccessoryView = [[UISwitch alloc] init];
#pragma mark - 返回大头针
//返回大头针
return annotationView;
}
系统大头针的处理
if([annotation isKindOfClass:[MKUserLocation class]]){
//返回nil,代表大头针的样式交由系统处理
return nil;
}
自定义大头针图片
//MKAnnotationView:默认没有界面 能消失图片
//MKPinAnnotationView:默认有界面,不能显示图片
//-------------------------------------------------
//设置图片
annotationView.image = [UIImage imageNamed:@"cls"];
//大头针即将显示在界面时调用
//views:地图上所有的大头针
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views{
for (MKAnnotationView *view in views) {
//1.保存大头针最终的位置
CGRect viewFrame = view.frame;
//2.修改大头针的位置
view.frame = CGRectMake(viewFrame.origin.x, 0, viewFrame.size.width, viewFrame.size.height);
//3.动画回归
[UIView animateWithDuration:2.0 animations:^{
view.frame = viewFrame;
}];
}
}
修改大头针模型
#import
#import
//1.导入框架 2.遵循协议 3.拷贝属性
@interface MyAnnotation : NSObject
//大头针的经纬度
@property (nonatomic) CLLocationCoordinate2D coordinate;
//大头针的标题
@property (nonatomic, copy) NSString *title;
//大头针的子标题
@property (nonatomic, copy) NSString *subtitle;
//大头针图片
@property (nonatomic, copy) NSString *iconImage;
@end
//创建annotation对象时设置图片
annotation.iconImage = @"cls";
//annotationcell中设置图片
//MyAnnotation *anno = (MyAnnotation *)annotation;
annotationView.image = [UIImage imageNamed:annotation.iconImage];
//删除大头针
// [self.mapView removeAnnotation:annotation];
//删除多个大头针
[self.mapView removeAnnotations:self.mapView.annotations];
自己初始位置不设置动画
//自己的位置不设置动画
//MKModernUserLocationView:是私有类不能直接使用
if([view isKindOfClass:NSClassFromString(@"MKModernUserLocationView")]){
continue;
}
自定义MKAnnotationView
#import "MyAnnotationView.h"
#import "MyAnnotation.h"
@implementation MyAnnotationView
+(instancetype)annotationViewWithMapView:(MKMapView *)mapView{
//获取ID
static NSString *ID = @"annotation";
//获取大头针
//MKAnnotationView:默认没有界面 能消失图片
//MKPinAnnotationView:默认有界面,不能显示图片
MyAnnotationView *annotationView = (MyAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
//判断并创建大头针
if(annotationView == nil) {
annotationView = [[MyAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];
}
//自定义大头针后.默认不会显示标题和子标题
//调出标题和子标题
annotationView.canShowCallout = YES;
//如果没有设置标题 以下代码全部失效
//左边界面
annotationView.leftCalloutAccessoryView = [[UISwitch alloc] init] ;
//右边界面
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
//中间界面 会覆盖大头针的子标题
annotationView.detailCalloutAccessoryView = [[UISwitch alloc] init];
return annotationView;
}
-(void)setAnnotation:(MyAnnotation *)annotation {
[super setAnnotation:annotation];
//设置图片
//MyAnnotation *anno = (MyAnnotation *)annotation;
self.image = [UIImage imageNamed:annotation.iconImage];
}