http://blog.csdn.net/debolee/article/details/44886209
使用苹果自带的地图框架,需要在项目中加载MapKit.framework(项目—TARGETS--Build Phases--Link Binary With Libraries),并在头文件中导入
#import
<MapKit/MapKit.h>
一、MKMapView的常用属性和方法
NSArray *annotations;//保存地图中的大头针
MKCoordinateRegion
region; //显示区域
MKCoordinateRegion是个结构体,包括两个属性
typedefstruct {
CLLocationCoordinate2D center;
MKCoordinateSpan span;
} MKCoordinateRegion;
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;
//设置显示区域
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 = [sender locationInView : self . view ];
// 将屏幕上的点转换为地图坐标
CLLocationCoordinate2D coord = [ self . mapView convertPoint :p toCoordinateFromView : self . view ];
NSLog ( @"coord.longitude:%lf coord.latitude:%lf" , coord. longitude ,coord. latitude );
- ( IBAction )tapAction:( UITapGestureRecognizer *)sender {
CGPoint p = [sender locationInView : self . view ];
// 将屏幕上的点转换为地图坐标
CLLocationCoordinate2D coord = [ self . mapView convertPoint :p toCoordinateFromView : 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 ) CLLocationCoordinate2D coordinate;
// 选择实现
// Title and subtitle for use by selection UI.
@property ( nonatomic , copy ) NSString *title;
@property ( nonatomic , copy ) NSString *subtitle;
@property ( nonatomic , readonly ) CLLocationCoordinate2D coordinate;
// 选择实现
// 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
.
mapView
annotations
];
//移除地图中所有的大头针
[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];
- (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;
[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;
static NSString *annotationViewId = @"annotationView";
//从队列中获取一个annotationView
XYZAnnotationView *annotationView = (XYZAnnotationView *)[self.mapViewdequeueReusableAnnotationViewWithIdentifier:annotationViewId];
//如果队列中没有,则创建一个新的annotationView
if (!annotationView) {
annotationView = [[XYZAnnotationViewalloc]initWithAnnotation:annotationreuseIdentifier:annotationViewId];
}
return annotationView;
}