ios自带地图笔记


//  ios自带地图笔记


 导入<MapKit/MapKit.h>    <CoreLocation/CoreLocation.h>  两个库

 引用地图前  尽量用真机测试  模拟器的话  等程序运行起来之后点击  xcode下方的  位置图片按钮标识  便可

 需在info.plist中追加NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription字段.其中:

 NSLocationWhenInUseUsageDescription表示应用在前台的时候可以搜到更新的位置信息。

 NSLocationAlwaysUsageDescription表示应用在前台和后台(suspend或terminated)都可以获取到更新的位置数据。

  

  

 */

#import "ViewController.h"

#import <MapKit/MapKit.h>

#import <CoreLocation/CoreLocation.h>

 

@interface ViewController ()<MKMapViewDelegate,CLLocationManagerDelegate>

{

    MKMapView *_mapView;

    CLLocationManager *locationManager;

    CLLocation *location;

}

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    _mapView =[[MKMapView alloc]initWithFrame:self.view.bounds];

    _mapView.zoomEnabled = YES;

    _mapView.showsUserLocation = YES;

    _mapView.scrollEnabled = YES;

    _mapView.delegate = self;

    [self.view addSubview:_mapView];

    if([[UIDevice currentDevice].systemVersion floatValue] > 8.0f)

    {

        [self getUserLocation];

    }

     // 长按手势  长按添加大头针

    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(lpgrClick:)];

    [_mapView addGestureRecognizer:lpgr];

     

}

//获取当前位置

- (void)getUserLocation

{

    locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;

    //kCLLocationAccuracyBest:设备使用电池供电时候最高的精度

    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;

    locationManager.distanceFilter = 50.0f;

    if (([[[UIDevice currentDevice] systemVersion] doubleValue] >= 8.0))

    {

        [locationManager requestAlwaysAuthorization];

    }

    //更新位置

    [locationManager startUpdatingLocation];

}

#pragma mark-CLLocationManagerDelegate  位置更新后的回调

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

{

    //停止位置更新

    [locationManager stopUpdatingLocation];

     

    CLLocation *loc = [locations firstObject];

    CLLocationCoordinate2D theCoordinate;

    //位置更新后的经纬度

    theCoordinate.latitude = loc.coordinate.latitude;

    theCoordinate.longitude = loc.coordinate.longitude;

    //设定显示范围

    MKCoordinateSpan theSpan;

    theSpan.latitudeDelta=0.01;

    theSpan.longitudeDelta=0.01;

    //设置地图显示的中心及范围

    MKCoordinateRegion theRegion;

    theRegion.center=theCoordinate;

    theRegion.span=theSpan;

    [_mapView setRegion:theRegion];

    location = [locations lastObject];

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    

    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *array, NSError *error)

     {

         CLGeocoder *geocoder = [[CLGeocoder alloc] init];

         [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *array, NSError *error) {

              

             if (array.count > 0)

             {

                 CLPlacemark *placemark = [array objectAtIndex:0];

                 // 将获得的所有信息显示到label上

                 NSLog(@"%@",placemark.administrativeArea);

                 // 获取城市

                 NSString *city = placemark.administrativeArea;

                 if (!city) {

                     // 四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)

                     city = placemark.administrativeArea;

                 }

                 NSLog(@"当前城市:%@",city);

                 // 设置地图显示的类型及根据范围进行显示  安放大头针

                 MKPointAnnotation *pinAnnotation = [[MKPointAnnotation alloc] init];

                 pinAnnotation.coordinate = theCoordinate;

                 pinAnnotation.title = city;

                 [_mapView addAnnotation:pinAnnotation];

             }

             else if (error == nil && [array count] == 0)

             {

                 NSLog(@"No results were returned.");

             }

             else if (error != nil)

             {

                 NSLog(@"An error occurred = %@", error);

             }

          

              

         }];

          

     }];

}

 

// 每次添加大头针都会调用此方法  可以设置大头针的样式

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

{

    // 判断大头针位置是否在原点,如果是则不加大头针

    if([annotation isKindOfClass:[mapView.userLocation class]])

        return nil;

    static NSString *annotationName = @"annotation";

    MKPinAnnotationView *anView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationName];

    if(anView == nil)

    {

        anView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annotationName];

    }

    anView.animatesDrop = YES;

    //    // 显示详细信息

    anView.canShowCallout = YES;

//    anView.leftCalloutAccessoryView   可以设置左视图

//    anView.rightCalloutAccessoryView   可以设置右视图

    return anView;

}

 

//长按添加大头针事件

- (void)lpgrClick:(UILongPressGestureRecognizer *)lpgr

{

    // 判断只在长按的起始点下落大头针

    if(lpgr.state == UIGestureRecognizerStateBegan)

    {

        // 首先获取点

        CGPoint point = [lpgr locationInView:_mapView];

        // 将一个点转化为经纬度坐标

        CLLocationCoordinate2D center = [_mapView convertPoint:point toCoordinateFromView:_mapView];

        MKPointAnnotation *pinAnnotation = [[MKPointAnnotation alloc] init];

        pinAnnotation.coordinate = center;

        pinAnnotation.title = @"长按";

        [_mapView addAnnotation:pinAnnotation];

    }

}

 

//计算两个位置之间的距离

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{

    NSLog(@"%@",error);

}

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

 

 

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值