需要准備工作按照下圖引進類庫
需要添加
添加的兩個字符串為:NSLocationWhenInUseUsageDescription / NSLocationAlwaysUsageDescription
默認定位設置:
設置工作准備完畢上代碼:
指示根視圖:
[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:23/255.0 green:180/255.0 blue:237/255.0 alpha:1]]; self.window.rootViewController = [MapViewController new];
MapViewController.m//設置需要的屬性
#import MapViewController.h #import#import Mypoint.h #import @interface MapViewController () @property (nonatomic, strong) MKMapView *mapView; //經度 @property (nonatomic, strong) UITextField *longitudetext; //緯度 @property (nonatomic, strong) UITextField *latitudeText; //經度 @property (nonatomic, strong) UILabel *longitudeLabel; //緯度 @property (nonatomic, strong) UILabel *latitudelabel; //防止標注的button[ @property (nonatomic, strong) UIButton *button; //地址輸入 @property (nonatomic, strong) UITextField *destination; //輸入地址查詢地圖 @property (nonatomic, retain) UIButton *searchButton; //可以獲取設備當前的經緯度信息 @property (nonatomic, strong) CLLocationManager *locManager; @end @implementation MapViewController
調用:
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.locManager = [[CLLocationManager alloc]init]; //代理 _locManager.delegate = self; //定位精度 _locManager.desiredAccuracy = kCLLocationAccuracyBest; //定位頻率,10米定位一次 CLLocationDistance distance = 10.0; _locManager.distanceFilter = distance; //更新位置 [_locManager requestAlwaysAuthorization]; [self.locManager startUpdatingLocation]; //查詢兩個地點之間的距離 [self countDistance]; //調用布置視圖 [self configureView]; [self setMapView]; }
//布置視圖
- (void)configureView{ //經度 self.longitudeLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 20, 40, 30)]; self.longitudeLabel.text = @經度; self.longitudetext = [[UITextField alloc]initWithFrame:CGRectMake(40, 20, 120, 30)]; self.longitudetext.borderStyle = UITextBorderStyleRoundedRect; //緯度 self.latitudelabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 50, 40, 30)]; self.latitudelabel.text = @緯度; self.latitudeText = [[UITextField alloc]initWithFrame:CGRectMake(40, 50, 120, 30)]; self.latitudeText.borderStyle = UITextBorderStyleRoundedRect; //放置標注按鈕 self.button = [UIButton buttonWithType:(UIButtonTypeSystem)]; self.button.frame = CGRectMake(30, 73, 100, 30); [self.button setTitle:@放置標注 forState:(UIControlStateNormal)]; [self.button addTarget:self action:@selector(annotationAction:) forControlEvents:(UIControlEventTouchUpInside)]; //地址輸入 self.destination = [[UITextField alloc]initWithFrame:CGRectMake(200, 26, 100, 30)]; self.destination.borderStyle = UITextBorderStyleRoundedRect; //查詢按鈕 self.searchButton = [UIButton buttonWithType:(UIButtonTypeSystem)]; self.searchButton.frame = CGRectMake(200, 46, 100, 30); [self.searchButton setTitle:@查詢 forState:(UIControlStateNormal)]; [self.searchButton addTarget:self action:@selector(detailSearchAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.view addSubview:self.button]; [self.view addSubview:self.latitudelabel]; [self.view addSubview:self.longitudeLabel]; [self.view addSubview:self.longitudetext]; [self.view addSubview:self.latitudeText]; [self.view addSubview:self.searchButton]; [self.view addSubview:self.destination]; }
- (void)countDistance{ CLLocation *loc1 = [[CLLocation alloc]initWithLatitude:34 longitude:113]; CLLocation *loc2 = [[CLLocation alloc]initWithLatitude:35 longitude:113]; CLLocationDistance distance = [loc1 distanceFromLocation:loc2]; NSLog(@(%@) 和 (%@)的距離為: %f, loc1, loc2, distance); }
#pragma mark - CLLocationManagerDelegate Methods
// 此方法會被頻繁調用
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { // NSLog(@didUpdateLocations---%lu, (unsigned long)locations.count); // 用來表示某個位置的地理信息, 比如經緯度, 海拔等等 CLLocation *location = locations.lastObject; // location.coordinate.latitude 維度 // location.coordinate.longitude 經度 NSLog(@經度 == %f, 維度 == %f, location.coordinate.longitude, location.coordinate.latitude); self.longitudetext.text = [NSString stringWithFormat:@%f,location.coordinate.longitude]; self.latitudeText.text = [NSString stringWithFormat:@%f,location.coordinate.latitude]; // 停止更新位置(不用定位服務時馬上停止, 因為非常耗電) // [manager stopUpdatingLocation]; }
//調出地圖
- (void)setMapView{ //創建地圖視圖,初始化參數 //MKMapTypeStandard 顯示街道和道路 //MKMapTypeSatellite 顯示衛星 //MKMapTypeHybrid 顯示混合地圖 self.mapView = [[MKMapView alloc]initWithFrame:CGRectMake(0, 100, 320, 460)]; [self.mapView setMapType:MKMapTypeStandard]; //顯示用戶當前的坐標,打開地圖有相應的提示 self.mapView.showsUserLocation = YES; //設置地圖代理 self.mapView.delegate = self; [self.view addSubview:self.mapView]; }
#pragma mark 根據輸入的經緯度確定位置
//放置標注
//放置標注 - (void)annotationAction:(UIButton *)sender{ //創建CLLocation 設置經緯度 CLLocationCoordinate2D location = CLLocationCoordinate2DMake([[self.latitudeText text]floatValue], [[self.longitudetext text]floatValue] ); //創建標題 NSString *title = [NSString stringWithFormat:@%f,%f,location.latitude,location.longitude]; Mypoint *myPoint = [[Mypoint alloc]initWithCoordinate:location andTitle:title]; //添加標注 [self.mapView addAnnotation:myPoint]; //放大到標注的位置 MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, 0.01, 0.01); [self.mapView setRegion:region]; [self showLocation]; }
//根據輸入的經緯度顯示位置
//根據輸入的經緯度顯示位置 - (void)showLocation{ //創建CLLocation 設置經緯度 CLLocationCoordinate2D location = CLLocationCoordinate2DMake([[self.latitudeText text]floatValue], [[self.longitudetext text]floatValue] ); //放大到標注的位置 MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, 0.01, 0.01); [self.mapView setRegion:region animated:YES]; }
#pragma mark 根據輸入的地址搜尋位置
//根據地址輸入搜索地圖
//根據地址輸入搜索地圖 - (void)detailSearchAction:(UIButton *)search{ if (_destination.text == nil || [_destination.text length] == 0) { return; } CLGeocoder *geocode = [[CLGeocoder alloc]init]; [geocode geocodeAddressString:_destination.text completionHandler:^(NSArray *placemarks, NSError *error) { if (error || placemarks.count == 0) { NSLog(@地址不存在); }else{ for (CLPlacemark *placemark in placemarks) { NSLog(@name=%@ locality=%@ country=%@ postalCode=%@,placemark.name,placemark.locality,placemark.country,placemark.postalCode); } CLPlacemark *firstPlacemark = [placemarks firstObject]; CLLocationDegrees latitude = firstPlacemark.location.coordinate.latitude; CLLocationDegrees longitude = firstPlacemark.location.coordinate.longitude; //顯示經緯度 self.latitudeText.text = [NSString stringWithFormat:@%.2f,latitude]; self.longitudetext.text = [NSString stringWithFormat:@%.2f,longitude]; [self showLocation]; [self searchDetailLocationAction]; } }]; }
//根據地址搜尋位置
//根據地址搜尋位置 - (void)searchDetailLocationAction{ //創建CLLocation 設置經緯度 CLLocationCoordinate2D location = CLLocationCoordinate2DMake([self.latitudeText.text floatValue], [self.longitudetext.text floatValue]); //創建標題 NSString *title = [NSString stringWithFormat:@%f,%f,[self.latitudeText.text floatValue], [self.longitudetext.text floatValue]]; Mypoint *myPoint = [[Mypoint alloc]initWithCoordinate:location andTitle:title]; //添加標注 [self.mapView addAnnotation:myPoint]; //放大到標注的位置 MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, 0.01, 0.01); [self.mapView setRegion:region]; }
//.h #import#import @interface Mypoint : NSObject //實現MKAnnotion協議必須要定義這個屬性 @property (nonatomic,readonly)CLLocationCoordinate2D coordinate; //標題 @property (nonatomic,copy)NSString *title; //初始化方法 - (id)initWithCoordinate:(CLLocationCoordinate2D)c andTitle:(NSString *)t; @end
//.m #import Mypoint.h @implementation Mypoint //初始化方法 - (id)initWithCoordinate:(CLLocationCoordinate2D)c andTitle:(NSString *)t{ if (self = [super init]) { _coordinate = c; _title = t; } return self; } @end
最終效果: