您的位置:首页 > 移动开发 > IOS开发

iOS地图 -- 区域监听的实现和小练习

2016-09-05 23:04 176 查看

区域监听用到的方法

[self.mgr startMonitoringForRegion:region];
--> 开启区域监听,没有返回值,在代理方法中得到信息并且处理信息
注:该方法只有用户位置发生变化的时候,相应的代理方法才会触发


[self.mgr requestStateForRegion:region];
-->根据指定区域请求一下用户现在的位置状态(CLRegionStateUnknown, CLRegionStateInside, CLRegionStateOutside),没有返回值,同样也是在代理方法中处理信息
注:该方法在程序一启动就会请求用户的位置状态.同样当用户位置发生变化时,也会触发相应的代理方法


- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
--> 进入指定区域后执行的代码

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
--> 离开指定区域后执行的代码

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
--> 在指定区域内确定了状态后触发的代理方法

区域监听的练习以及练习中的细节处理

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()<CLLocationManagerDelegate>
/** 位置管理者 */
@property(nonatomic,strong) CLLocationManager *mgr;
@property (weak, nonatomic) IBOutlet UILabel *msgLabel;

@end

@implementation ViewController

#pragma mark - 懒加载
- (CLLocationManager *)mgr
{
if (_mgr == nil) {
_mgr = [[CLLocationManager alloc] init];
_mgr.delegate = self;
// 区域监听,监听的是用户,所以应该让用户授权获取用户当前位置
if ([_mgr respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[_mgr requestAlwaysAuthorization];
}
}
return _mgr;
}

- (void)viewDidLoad {
[super viewDidLoad];

// ###细节二:判断设备是否支持区域监听(指定区域类型,一般是圆形区域)
if (![CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]) {
return;
}

// 0.给定一个区域
// 0.1 区域的中点坐标
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(22.22, 33.33);
// 0.2区域半径
CLLocationDistance distance = 1000.0;
// ###细节一:半径有限制
if (distance > self.mgr.maximumRegionMonitoringDistance) {
distance = self.mgr.maximumRegionMonitoringDistance;
}
CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:distance identifier:@"Chaos"];

// 1.开启区域监听 代理中操作 -- 该方法只有用户位置发生了移动才会触发
//    [self.mgr startMonitoringForRegion:region];
// 1.根据指定区域请求一下监听到的状态 代理中操作 -- 该方法在程序启动就会监听一下用户的位置
// 同样当用户位置发生变化时,也会触发相应的代理方法
[self.mgr requestStateForRegion:region];
}

#pragma mark - CLLocationManagerDelegate

/**
*  进入指定区域后指定的代码
*
*  @param manager 位置管理者
*  @param region  指定的区域
*/
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
NSLog(@"进入区域--");
self.msgLabel.text = @"欢迎光临--";
}
/**
*  离开指定区域后执行的代码
*
*  @param manager 位置管理者
*  @param region  指定的区域
*/
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
NSLog(@"离开区域--");
self.msgLabel.text = @"下次再来--";
}

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
/*
CLRegionStateUnknown, 不知道
CLRegionStateInside, 进入区域
CLRegionStateOutside 离开区域
*/
if (state == CLRegionStateInside) {

self.msgLabel.text = @"欢迎光临";
} else if (state == CLRegionStateOutside) {

self.msgLabel.text = @"下次再来";
}
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: