MapKit的基本使用

简介: MapKit的基本使用

题外话:先学习CoreLocation的原因是:MapKit有一部分知识是基于CoreLocation,所以前面必须先了解CoreLocation


注意事项:


  • 导入头文件<MapKit/MapKit.h>
  • Mapkit框架里面的所有的数据类型的前缀都是以MK开头的
  • MapKit有一个比较重要的UI控件:MKMapView ,专门用于地图显示


地图显示的概括:(导入框架<MapKit/MapKit.h>)


  • 1.把地图放在view上
  • 2.设置地图显示类型


/*
 MKMapTypeStandard  标准类型
 MKMapTypeSatellite, 卫星图
 MKMapTypeHybrid, 混合的图(标准+卫星)
 MKMapTypeSatelliteFlyover
 MKMapTypeHybridFlyover
 */


image.png


  • 3.请求获取用户获取地理位置权限(需要在info.plist里面进行配置)


[self.locationManger requestAlwaysAuthorization];
配置代码:NSLocationAlwaysUsageDescription
  • 4.追踪用户的位置(这样才可以显示大头针,也就是地图上蓝色的小点点)


/*
  MKUserTrackingModeNone = 0, 不追踪,不准确
  MKUserTrackingModeFollow, 追踪
  MKUserTrackingModeFollowWithHeading,  追踪并且获取用户方向
 */
  • 5.给MKMapView的对象挂代理,当在4中追踪到用户的位置之后就会调用下面的方法


-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
 {
 }


image.png

  • 6.点击大头针显示用户的位置信息(这步操作是在第5步里面的方法中完成的)


  • 提示:只要用户的地理位置发生改变下面的方法才会被调用,位置不发生改变就不会被调用

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
   {
     6.1 利用反地理编码,利用用户的经纬度来获取用户的位置名字,首先要在外面建立一个CLGeocoder *geocoder对象   
     6.2 调用一个方法(如下图):userLocation是大头针模型
         第一个参数直接是用户的位置:userLocation.location
        [self.geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
           CLPlacemark *placekmark = [placemarks firstObject];
           userLocation.title = placekmark.name;
           userLocation.subtitle = placekmark.locality;
        }];
      6.3 效果如下图
   }


image.png

image.png

image.png


具体的代码如下:



提示:(运行下面的代码之前记得在info.plist里面进行权限配置)


#import "ViewController.h"

#import <MapKit/MapKit.h>

@interface ViewController ()<MKMapViewDelegate>

@property(nonatomic,strong) MKMapView *mapView;
@property(nonatomic,strong)  CLLocationManager *locationManger;
@property(nonatomic,strong) CLGeocoder *geocoder;
@end
@implementation ViewController
//1.显示地图
-(MKMapView *)mapView
{
if (!_mapView) {
    _mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:_mapView];
}
return _mapView;
}
- (void)viewDidLoad {
[super viewDidLoad];
//2.设置地图显示类型
self.mapView.mapType = MKMapTypeStandard;
/*
   MKMapTypeStandard  标准类型
   MKMapTypeSatellite, 卫星图
   MKMapTypeHybrid, 混合的图(标准+卫星)
   MKMapTypeSatelliteFlyover
   MKMapTypeHybridFlyover
 */
//3用户定位权限跟踪设置
[self.locationManger requestAlwaysAuthorization];
//4.如果想利用MapView获取用户的位置,可以追踪用户的诶之
self.mapView.userTrackingMode = MKUserTrackingModeFollow;
/*
 MKUserTrackingModeNone = 0, 不追踪,不准确
 MKUserTrackingModeFollow, 追踪
 MKUserTrackingModeFollowWithHeading,  追踪并且获取用户方向
 */
//注意在IOS8里面想要追踪用户的位置,必须自己请求隐私权限
//5.关于地图的一些其他设置
//mapView.rotateEnabled = YES;
/*
 scrollEnabled  支持拖动
 rotateEnabled  支持旋转
 pitchEnabled   支持缩放
 */
//mapView.showsUserLocation = YES;
//6.锁定位置直接移动到指定位置
self.mapView.delegate = self;
}
#pragma mark MKMapViewDelegate
/*
 *  每次更新到用户的位置就会调用(调用不 频繁,只有位置改变才会调用)
 *
 *  @param mapView  促发事件的控件
 *
 *  @param userLocation  大头针模型
 *
 */
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
/*
  地图上蓝色的点就称之为大头针
  大头针可以拥有标题/子标题/位置信息
  MKUserLocation 大头针是由大头针的模型来确定
 */
//6.1设置大头针显示的内容
//    userLocation.title = @"蓝科";
//    userLocation.subtitle = @"牛逼";
//6.2移动地图到用户所在的位置
//获取用户当前所在位置的经纬度,并且设置为地图的中心点
//[self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
//6.3设置地图显示的区域
//获取用户的位置
//    
//    CLLocationCoordinate2D center = userLocation.location.coordinate;
//    
//    //将用户当前的位置作为显示区域的中心点,并且指定需要显示的跨度范围
//    //
//    MKCoordinateSpan span = MKCoordinateSpanMake(100, 100);
//    MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
//    
//    //设置显示区域
//    [self.mapView setRegion:region animated:YES];
//
//利用饭地理编码获取位置之后设置标题
[self.geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    CLPlacemark *placekmark = [placemarks firstObject];
    userLocation.title = placekmark.name;
    userLocation.subtitle = placekmark.locality;
    NSLog(@"==%@ ==%@",userLocation.title, userLocation.subtitle);
}];
}
-(CLGeocoder *)geocoder
{
if (!_geocoder) {
    _geocoder = [[CLGeocoder alloc]init];
}
return _geocoder;
}
-(CLLocationManager *)locationManger
{
if (!_locationManger) {
    _locationManger = [[CLLocationManager alloc]init];
}
return _locationManger;
}
@end


image.png

目录
相关文章
|
7月前
最新jsonwebtoken-jjwt 0.12.3 基本使用
最新jsonwebtoken-jjwt 0.12.3 基本使用
675 0
|
4月前
|
网络安全 Perl
Nikto——基本使用
Nikto——基本使用
65 0
|
7月前
|
存储 缓存 Java
【scoop】安装及基本使用
【scoop】安装及基本使用
508 0
|
7月前
|
存储 NoSQL 定位技术
RedisGEO的基本使用
对GEO的基本介绍
QWebEngineView简单使用
QWebEngineView是提供一个访问web页面的widget,这里是一个简单的使用代码
182 0
ApplicationEventPublisher的简单使用
ApplicationEventPublisher的简单使用
442 0
MPPlayer的简单使用
MPPlayer的简单使用
210 0
CodeBlock 基本使用
基本介绍 代码块又称为初始化块,属于类中的成员【即是类的一部分,类似于方法,讲逻辑语句封装在方法体中,通过{}包围起来】 和方法不同,没有方法名,没有返回值,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时或创建对象时隐式调用。
156 0
|
Go
基本使用
基本使用
87 0