地图location定位

#import <UIKit/UIKit.h>


@interface MapViewController : UIViewController

@property(nonatomic,strong)NSString *addressName; // 用于接收地址字符串的属性

@end



#import <MapKit/MapKit.h>

#import "LocationHandle.h"


@interface MapViewController ()<MKMapViewDelegate>

@property(nonatomic,strong)MKMapView *mapView;  // 地图视图

@end


@implementation MapViewController



-(MKMapView *)mapView

{

    if (!_mapView) {

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

        _mapView.delegate = self;

        _mapView.zoomEnabled = YES;

        _mapView.scrollEnabled = YES;

        _mapView.pitchEnabled = YES;

        _mapView.rotateEnabled = YES;

        

        /*

         typedef NS_ENUM(NSUInteger, MKMapType) {

         MKMapTypeStandard = 0,

         MKMapTypeSatellite,

         MKMapTypeHybrid,

         MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0),

         MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0),

         }

         */

        

        

        _mapView.mapType = MKMapTypeStandard// 综合地图

        //  [_mapView setUserTrackingMode:MKUserTrackingModeFollow]; // 设置用户跟踪模式

        // _mapView.showsUserLocation = YES; // 显示用户当前位置

        

    }

    return _mapView;

}


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    [self.view addSubview:self.mapView];

    

    UIBarButtonItem *bar1 = [[UIBarButtonItem alloc] initWithTitle:@"省会位置" style:UIBarButtonItemStylePlain target:self action:@selector(locateProvince:)];

    UIBarButtonItem *bar2 = [[UIBarButtonItem alloc] initWithTitle:@"当前位置" style:UIBarButtonItemStylePlain target:self action:@selector(locateCurrentLocation:)];

    

    self.navigationItem.rightBarButtonItems = @[bar1,bar2];

    

    

    // 注册通知,监听当前位置获取

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getCurrentLocationByNotification:) name:@"passLoc" object:nil];

}



-(void)viewWillAppear:(BOOL)animated

{

    [super viewWillAppear:animated];

    self.navigationItem.title = self.addressName;

}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

#pragma mark - 自定义触发方法

// 定位省会位置

-(void)locateProvince:(id)sender

{

    // 获取字符串代表的经纬度

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

    [geocoder geocodeAddressString:self.addressName completionHandler:^(NSArray *placemarks, NSError *error) {

        CLPlacemark *place = [placemarks lastObject];

        CLLocation *loc =   place.location;

        

        dispatch_async(dispatch_get_main_queue(), ^{

            [self.mapView setRegion:MKCoordinateRegionMake(loc.coordinate, MKCoordinateSpanMake(0.1, 0.1)) animated:YES];

            

            

            /*

             添加覆盖层方法与添加锚点方法相似,但是覆盖层没有定义好的视图,必须实现mapView中设置覆盖层视图的回调方法;

             */

            // 定义圆形覆盖层

            MKCircle *circle = [MKCircle circleWithCenterCoordinate:loc.coordinate radius:100];

            // 添加圆形覆盖层

            [self.mapView addOverlay:circle];

            

        });

        

    }];

}


// 定位当前位置

-(void)locateCurrentLocation:(id)sender

{

    [[LocationHandle sharedLocationControl] getCurrentLocation];

}


#pragma mark - 当前位置获取

-(void)getCurrentLocationByNotification:(NSNotification *)notifi

{

    // 获取当前位置

    CLLocation *curLoc = [notifi object];

    

    

    // 设置显示区域

    MKCoordinateRegion region = MKCoordinateRegionMake(curLoc.coordinate, MKCoordinateSpanMake(0.1, 0.1));

    // 改变地图的显示范围

    [self.mapView setRegion:region animated:YES];

    

#if 1

    // 在当前位置添加一个锚点

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

    // 设置显示位置

    point.coordinate = curLoc.coordinate;

    // 设置主标题

    point.title = [NSString stringWithFormat:@"纬度:%g,经度:%g",curLoc.coordinate.latitude,curLoc.coordinate.longitude];

    

    // 反向地址解析,得到经纬度代表的地址字符串

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

    [geocoder reverseGeocodeLocation:curLoc completionHandler:^(NSArray *placemarks, NSError *error) {

        CLPlacemark *curPlace = [placemarks lastObject];

        NSString *address = curPlace.name;

        

        dispatch_async(dispatch_get_main_queue(), ^{

            // 设置锚点副标题

            point.subtitle = address;

            // 将锚点添加到地图上

            [self.mapView addAnnotation:point];

        });

    }];

    

#else

    

    /*

     添加覆盖层方法与添加锚点方法相似,但是覆盖层没有定义好的视图,必须实现mapView中设置覆盖层视图的回调方法;

     */

    // 定义圆形覆盖层

    MKCircle *circle = [MKCircle circleWithCenterCoordinate:curLoc.coordinate radius:600];

    // 添加圆形覆盖层

    [self.mapView addOverlay:circle];

    

#endif

    

}


#pragma mark - MKMapViewDelegate

// 设置锚点视图样式,(在MKMapView对象调用addAnnotation方法时回调此方法)

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

{

#if 0

    static NSString *identifier = @"pin";

    // 使用大头针锚点

    MKPinAnnotationView *pin = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    //

    if (pin == nil) {

        pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];

    }

    // 设置大头针颜色

    [pin setPinColor:MKPinAnnotationColorPurple];

    // 设置大头针掉落的动画效果

    pin.animatesDrop = YES;

    // 设置可以弹出气泡

    pin.canShowCallout = YES;

    // 设置气泡左选项

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];

    [btn setFrame:CGRectMake(0, 0, 20, 20)];

    [btn addTarget:self action:@selector(btnDidhandle:) forControlEvents:UIControlEventTouchUpInside];

    pin.leftCalloutAccessoryView = btn;

    return pin;

#else

    static NSString *identifier = @"custom";

    MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if (annoView == nil) {

        annoView = [[MKAnnotationView alloc] init];

    }

    // 设置可以弹出气泡

    annoView.canShowCallout = YES;

    // 设置气泡右侧附件视图

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    [btn setFrame:CGRectMake(0, 0, 20, 20)];

    [btn addTarget:self action:@selector(btnDidhandle:) forControlEvents:UIControlEventTouchUpInside];

    annoView.rightCalloutAccessoryView = btn;

    // 设置自定义的图片

    annoView.image = [UIImage imageNamed:@"location"];

    

    

    

    return annoView;

    

#endif

}




// 设置覆盖层样式的回调方法

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay

{

    

    MKCircle *circle = (MKCircle *)overlay;

    // 设置圆形覆盖层视图

    MKCircleRenderer *circleView = [[MKCircleRenderer alloc] initWithCircle:circle];

    // 设置填充颜色

    circleView.fillColor = [UIColor redColor];

    // 设置描边颜色

    circleView.strokeColor = [UIColor yellowColor];

    

    return circleView;

}



-(void)btnDidhandle:(id)sender

{

    NSLog(@"盛大的撒旦撒旦撒旦是");

}


转载于:https://my.oschina.net/zhaofengye/blog/632050

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者intuit,代码LocationManager。 INTULocationManager可以轻松获取设备在iOS上的当前位置和标题。 它是一个Objective-C库,在Swift中也很有用。 INTULocationManager提供基于块的异步API,以便一次或连续地请求当前位置。 它在内部管理多个同时位置和标题请求,每个一次性位置请求可以指定其自己所需的准确度和超时持续时间。 当第一个请求进入时,INTULocationManager会自动启动位置服务,并在所有请求完成后立即停止位置服务,同时动态管理位置服务所消耗的功率,以减少对电池寿命的影响。 CLLocationManager有什么问题? CLLocationManager要求您手动检测和处理权限,陈旧/不准确的位置,错误等内容。 CLLocationManager使用更传统的委托模式而不是现代的基于块的回调模式。虽然它可以很好地跟踪用户位置随时间的变化(例如用于逐向导航),但是正确请求单个位置更新(例如确定用户当前城市以获取天气)非常麻烦预测,或从当前位置自动填充地址)。 INTULocationManager可以轻松地同时或连续请求设备的当前位置以及设备的连续标题。对于一次性位置请求和定期更新的定期订阅,API非常简单。对于一次性位置请求,您可以指定所需位置的准确程度,以及您愿意等待多长时间。还支持重要的位置变更监控。 INTULocationManager具有高能效,可通过自动确定和使用最有效的核心位置精度设置,以及在不再需要位置服务(例如GPS或指南针)时自动断电,从而节省设备的电池电量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值