zoukankan      html  css  js  c++  java
  • iOS定位功能

    1.实现定位功能需要导入系统库MapKit.framework

    2.在iPhone手机上默认是禁止手机定位的,所以,要询问系统是否开启手机定位功能。

    为了开启手机定位功能,还需在info.plist中添加开启定位描述。如图,

    3.功能代码如下:

    //
    //  ViewController.m
    //  MapLocationDemo
    //
    //  Created by apple on 15/12/3.
    //  Copyright © 2015年 hoondraw. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <CoreLocation/CoreLocation.h>
    #import "MapViewController.h"
    
    @interface ViewController () <CLLocationManagerDelegate>
    
    /** 定位管理类*/
    @property (strong, nonatomic) CLLocationManager *mgr;
    
    /** 地理编码对象*/
    @property (strong, nonatomic) CLGeocoder *geocoder;
    
    @property (weak, nonatomic) IBOutlet UILabel *latLabel;
    
    @property (weak, nonatomic) IBOutlet UILabel *longLabel;
    
    @property (weak, nonatomic) IBOutlet UILabel *geocoderLabel;
    
    /** 当前定位信息*/
    @property (strong, nonatomic) CLLocation *currentLocation;
    
    @end
    
    @implementation ViewController
    
    - (CLLocationManager *)mgr {
        if (!_mgr) {
            _mgr = [[CLLocationManager alloc] init];
        }
        return _mgr;
    }
    
    - (CLGeocoder *)geocoder {
        if (!_geocoder) {
            _geocoder = [CLGeocoder new];
        }
        return _geocoder;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.mgr.delegate = self;
        
        if ([[UIDevice currentDevice].systemVersion doubleValue]> 8.0) {
            //只在前台定位
            [self.mgr requestWhenInUseAuthorization];
        } else {
            NSLog(@"iOS7");
            //直接开始定位
            [self.mgr startUpdatingLocation];
        }
    }
    
    #pragma mark - 定位协议方法
    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
        if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
            //定位的设置参数
            self.mgr.desiredAccuracy = kCLLocationAccuracyBest;
            self.mgr.distanceFilter = kCLHeadingFilterNone;
            [self.mgr startUpdatingLocation];
        } else {
            //不允许定位
        }
        
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
        CLLocation *location = [locations lastObject];
        self.latLabel.text = [NSString stringWithFormat:@"经度:%lf", location.coordinate.latitude];
        self.longLabel.text = [NSString stringWithFormat:@"纬度:%lf", location.coordinate.longitude];
        
        //获取当前的location
        self.currentLocation = location;
        
        [self.mgr stopUpdatingLocation];
    }
    /** 地理编码*/
    - (IBAction)clickGecoder:(id)sender {
        NSString *name = @"广州市天河区天河珠江新城";
        //从服务器获取name对应的经纬度(请求)
        [self.geocoder geocodeAddressString:name completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
            if (!error) {
                //地理编码成功
                for (CLPlacemark *placemark in placemarks) {
                    self.latLabel.text = [NSString stringWithFormat:@"纬度:%lf",placemark.location.coordinate.latitude];
                    self.longLabel.text = [NSString stringWithFormat:@"经度:%lf",placemark.location.coordinate.longitude];
                    self.geocoderLabel.text = [NSString stringWithFormat:@"地址信息:%@",placemark.addressDictionary];
                }
            }
        }];
    }
    
    
    /** 反地理编码*/
    - (IBAction)clickGeoDecoder:(id)sender {
        CLLocation *location = [[CLLocation alloc] initWithLatitude:self.currentLocation.coordinate.latitude longitude:self.currentLocation.coordinate.longitude];
        
        [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
            if (!error) {
                //反地理编码成功
                for (CLPlacemark *placemark in placemarks) {
                    self.latLabel.text = [NSString stringWithFormat:@"纬度:%lf",placemark.location.coordinate.latitude];
                    self.longLabel.text = [NSString stringWithFormat:@"经度:%lf",placemark.location.coordinate.longitude];
                    self.geocoderLabel.text = [NSString stringWithFormat:@"地址信息:%@",placemark.addressDictionary];
                }
            }
        }];
    }
    
    - (IBAction)gotoMapView:(id)sender {
        MapViewController *vc = [[MapViewController alloc] init];
        [self presentViewController:vc animated:YES completion:nil];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }

    其中,gotoMapView是跳转到地图控制器的方法。

    代码如下:

    //
    //  MapViewController.m
    //  MapLocationDemo
    //
    //  Created by apple on 15/12/3.
    //  Copyright © 2015年 hoondraw. All rights reserved.
    //
    
    #import "MapViewController.h"
    #import <MapKit/MapKit.h>
    
    @interface MapViewController () <MKMapViewDelegate>
    
    @property (weak, nonatomic) IBOutlet MKMapView *mapView;
    
    @property (strong, nonatomic) CLLocationManager *mgr;
    
    @end
    
    @implementation MapViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.mgr = [[CLLocationManager alloc] init];
        [self.mgr requestWhenInUseAuthorization];
        //设置和地图相关的属性
        self.mapView.delegate = self;
        //设置地图的旋转属性
        self.mapView.rotateEnabled = YES;
        //使用地图视图开始定位
        self.mapView.userTrackingMode = MKUserTrackingModeFollow;
        
        
    }
    
    #pragma mark - MKMapViewDelegate
    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
        //地图显示的区域
        //设置地图的中心
        CLLocationCoordinate2D center = userLocation.location.coordinate;
        //设置跨度
        MKCoordinateSpan span = MKCoordinateSpanMake(5, 5);
        MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
        [self.mapView setRegion:region animated:YES];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    
    
    @end

    这样就可以跳转到地图中显示当前地理位置。

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/hd1992/p/5028610.html
Copyright © 2011-2022 走看看