iOS地圖 -- 區域監聽的實現和小練習


區域監聽用到的方法

  • [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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM