新建一个SingleView工程,代码以下:git
#import "ViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> @interface ViewController () <MKMapViewDelegate> { CLLocationManager *_manager; MKMapView *_mapView; } @property (nonatomic,strong) CLLocationManager *manager; @property (nonatomic,strong) MKMapView *mapView;; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self creatMapView]; [self creatAnnoations]; } - (void)creatMapView { //定位管理 self.manager = [[CLLocationManager alloc] init]; CGFloat v = [[[UIDevice currentDevice] systemVersion] doubleValue]; if (v >= 8.0) { //申请验证 [self.manager requestAlwaysAuthorization]; } //实例化地图 self.mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];//bounds是相对于自身视图 //设置地图的类型 /* MKMapTypeStandard = 0,//标准的 MKMapTypeSatellite,卫星地图 */ self.mapView.mapType = MKMapTypeStandard; //设置 地图显示的区域范围(地图在视图上的中心点) /* typedef struct { CLLocationCoordinate2D center;//经纬度 MKCoordinateSpan span;//缩放比例(0.01--0.05) } MKCoordinateRegion; */ self.mapView.region = MKCoordinateRegionMake(CLLocationCoordinate2DMake(34.77274892, 113.67591140), MKCoordinateSpanMake(0.01, 0.01)); //是否显示用户位置 self.mapView.showsUserLocation = YES; //设置代理 self.mapView.delegate = self; //粘贴到视图上 [self.view addSubview:self.mapView]; NSArray *titles = @[@"move",@"回到用户位置"]; for (NSInteger i = 0; i < titles.count; i++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(200*i, 100, 100, 30); [button setTitle:titles[i] forState:UIControlStateNormal]; button.tag = 101+i; [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } } - (void)btnClick:(UIButton *)button { if (button.tag == 101) { //移动-->更改 地图的中心点位置 //获取地理位置 CLLocationCoordinate2D coordinate = self.mapView.centerCoordinate; coordinate.latitude += 0.01; coordinate.longitude += 0.01; //更改中心点区域 [self.mapView setCenterCoordinate:coordinate animated:YES]; }else{ //回到用户原来当前位置 //获取用户位置 CLLocation * userLocation = self.mapView.userLocation.location; self.mapView.region = MKCoordinateRegionMake(userLocation.coordinate, MKCoordinateSpanMake(0.01, 0.01)); } } #pragma mark - 大头针/点标注 - (void)creatAnnoations { //先建立地图再建立大头针 /* 点标注:1.点标注视图(视图) 2.点标注数据(数据模型) //咱们在地图上看到的是点标注视图 点标注的视图数据 在点标注中 */ //建立点标注数据(大头针数据) MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; //设置大头针的经纬度 annotation.coordinate = CLLocationCoordinate2DMake(34.77274892, 113.67591140); annotation.title = @"千锋教育"; annotation.subtitle = @"纬五路21号"; //把大头针数据添加到地图上 增长 一个遵照 MKAnnotation的对象 [self.mapView addAnnotation:annotation]; } #pragma mark - MKMapViewDelegate /** * 当大头针视图显示的时候调用 *建立的都是大头针视图 * @param mapView 地图 * @param annotation 传入的大头针数据模型 * * @return 大头针视图 */ /* 全部的点标注视图的父类 MKAnnotationView MKPinAnnotationView 是 MKAnnotationView 的子类 */ - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { //采用 复用机制 //和咱们以前讲的tableView 相似的 /** * annotation 和 数据模型相似 * MKAnnotationView UITableViewCell相似 * mapView 和UITableView相似 咱们在地图上加了多少 annotation 数据 当前方法就会调用多少,就会传入多少个annotation */ //判断是哪一类大头针数据 if ([annotation isKindOfClass:[MKPointAnnotation class]]) { //从复用队列获取 大头针视图MKPinAnnotationView MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"MKPinAnnotationView"]; if (!pinView) { //没有那么建立 //根据 点标注模型 annotation 显示 大头针的内容 pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"MKPinAnnotationView"]; } //设置大头针视图的属性 pinView.animatesDrop = YES;//是否有掉落的效果 /* MKPinAnnotationColorRed = 0, MKPinAnnotationColorGreen, MKPinAnnotationColorPurple */ //设置颜色 pinView.pinColor = MKPinAnnotationColorRed; } return nil; } //大头针视图被选中 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { NSLog(@"大头针被选中"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end