使用苹果自带的地图框架,需要在项目中加载MapKit.framework(项目—TARGETS--Build Phases--Link Binary With Libraries),并在头文件中导入#import<MapKit/MapKit.h>
一、MKMapView的常用属性和方法
NSArray *annotations;//保存地图中的大头针
MKCoordinateRegionregion; //显示区域
MKCoordinateRegion是个结构体,包括两个属性
typedefstruct {
CLLocationCoordinate2D center;
MKCoordinateSpan span;
} MKCoordinateRegion;
CLLocationCoordinate2D//显示经纬度
MKCoordinateSpan//显示精度
//设置显示位置,显示在屏幕中心点
CLLocationCoordinate2D coord;
coord.longitude = 113.346196;
//经度
coord.latitude = 23.140563;//纬度
//地图的显示精度,数值越小地图显示越详细
MKCoordinateSpan span;
span.longitudeDelta = 0.1;
span.latitudeDelta = 0.1;
//设置显示区域
[self.mapViewsetRegion:(MKCoordinateRegionMake(coord,
span))];
//点击屏幕上的位置,获取经纬度
- (IBAction)tapAction:(UITapGestureRecognizer*)sender
{
CGPoint p = [senderlocationInView:self.view];
//将屏幕上的点转换为地图坐标
CLLocationCoordinate2D coord = [self.mapViewconvertPoint:ptoCoordinateFromView:self.view];
NSLog(@"coord.longitude:%lf coord.latitude:%lf", coord.longitude,coord.latitude);
}
二、在地图上设置大头针
在地图上显示大头针,苹果是通过遵守一个MapKit框架中MKAnnotation协议来实现的。
1、创建一个继承自NSObject的子类
2、在子类中导入
#import <MapKit/MapKit.h>
3、让子类遵守
MKAnnotation协议,实现协议中的属性和方法
//必须实现
@property(nonatomic,readonly)CLLocationCoordinate2Dcoordinate;
//选择实现
// Title and subtitle for use by selection UI.
@property(nonatomic,copy)NSString*title;
@property(nonatomic,copy)NSString*subtitle;
// Called as a result of dragging an annotation view.
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;
4、在地图中添加大头针
//创建一个大头针
XYZAnnotation*ann = [[XYZAnnotationalloc]init];
//设置经纬度等属性
[annsetCoordinate:coord];
ann.title=
@"华师地铁站";
ann.subtitle=
@"这里是华师地铁站";
//往地图上添加一个大头针
[self.mapViewaddAnnotation:ann];
//获取地图中的大头针
NSArray*anns = [self.mapViewannotations];
//移除地图中所有的大头针
[self.mapViewremoveAnnotations:anns];
5、自定义大头针视图
- 创建一个继承自MKAnnotationView的自定义大头针视图
@interface XYZAnnotationView :MKAnnotationView
@end
#import"XYZAnnotationView.h"
@implementation XYZAnnotationView
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithAnnotation:annotationreuseIdentifier:reuseIdentifier];
if (self) {
UIImageView
*imageView = [[UIImageView
alloc]initWithFrame:CGRectMake(-15,
-30,30,30)]; //点击屏幕放置大头针,设置大头针的frame.origin修正偏移
imageView.image = [UIImageimageNamed:@"pink.png"];
[self addSubview:imageView];
}
return self;
}
@end
- 当前视图控制器遵守 MKMapViewDelegate协议;
- 设置mapView的委托对象为当前视图控制器(self.mapView.delegate=
self或者在Storyboard中拖拽); - 实现协议方法
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
static
NSString *annotationViewId = @"annotationView";
//从队列中获取一个annotationView
XYZAnnotationView *annotationView = (XYZAnnotationView *)[self.mapViewdequeueReusableAnnotationViewWithIdentifier:annotationViewId];
//如果队列中没有,则创建一个新的annotationView
if (!annotationView) {
annotationView = [[XYZAnnotationViewalloc]initWithAnnotation:annotationreuseIdentifier:annotationViewId];
}
return annotationView;
}