前言:让有需要的人看一眼,如果能得到一些自己需要的,我将倍感荣幸.
注意###
如果用storyBoard的mapView要导入MapKit的framework.因为Xcode5以后,系统会自己导入框架,但是storyBoard要先于代码执行.所以要先导入框架.
如果一切弄好了,发现定位错了,改一下当前定位的位置
simulator的Debug->location->customer location -> 39,116(随便写,别写出国去,台湾是中国的一个省)
可以cmd R 运行一下 看一眼 然后进行下面的代码
设置地图类型###
//地图视图
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
/*
//标准
MKMapTypeStandard = 0,
//卫星
MKMapTypeSatellite,
//鸟瞰
MKMapTypeHybrid,
//以下两个暂时国内没用到
MKMapTypeSatelliteFlyover ,
MKMapTypeHybridFlyover ,
*/
self.mapView.mapType = MKMapTypeStandard;
//实时交通状况
// Affects MKMapTypeStandard and MKMapTypeHybrid(意思是只能在标准和鸟瞰下使用)
self.mapView.showsTraffic = true;
//显示用户位置
/*
不跟踪
MKUserTrackingModeNone = 0,
跟踪
MKUserTrackingModeFollow,
有方向的跟踪
MKUserTrackingModeFollowWithHeading
*/
self.mapView.userTrackingMode = MKUserTrackingModeFollow;
//定位必须授权 别忘了info.plist文件,key不要写错
self.locationManager = [CLLocationManager new];
[self.locationManager requestWhenInUseAuthorization];
//有可能用模拟器出不来交通状况,用真机则没有这些情况,应该是模拟器的一些bug.
点击定位的蓝色光圈显示真实位置###
现在点击蓝色光圈,显示的是My Location 不想要这个,想要具体位置
我在代码块里面标注123,显示的会清晰一些 所用代码还是上面的代码块,进行添加
//点击蓝色光圈 显示具体位置 步骤
//1.设置地图代理
self.mapView.delegate = self;
//2.遵循协议 <MKMapViewDelegate>
//3.实现方法
//代理方法---定位到用户位置 会调用(也就是userLocation -->大头针(有时间 会另起一章写一下看心情= =))
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
//点击MKUserLocation 进去找到 title和subTitle的属性 先设置一下,看看效果如何
// userLocation.title = @"北京市";
// userLocation.subtitle = @"天安门";
//可以进行修改,查找正确
//cmd 点击 MKUserLocation 进去再查找所需要属性 发现 @property (readonly, nonatomic, nullable) CLLocation *location; 有位置 可以进行反地理编码
//反地理编码 步骤走一波
//1.创建对象
CLGeocoder *gecoder = [CLGeocoder new];
//2.调用方法
[gecoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
//防错
if (error) {
NSLog(@"%@",error);
return;
}
//赋值
userLocation.title = placemarks[0].locality;
userLocation.subtitle = placemarks[0].name;
}];
}
//当网速慢的时候,要等一会,如果就是不想要My Location就把那两个title设置为正在加载,怎么开心怎么玩.
点击按钮 返回定位位置###
玩过地图的都知道 你找地方的时候,有个按钮 点一下就能回到最初的定位位置
用此方法可以回到当前位置,前提不放大不缩小 因为方法会以你最后一次的比例尺为标准 恢复到定位位置 我们需要的是 一开始的比例尺的定位
//拖线方法
- (IBAction)backAction {
//将用户的位置 设置为地图的中心点的经纬度
self.mapView.centerCoordinate = self.mapView.userLocation.coordinate;
}
改善 发现问题 2.0给的不对,确实用的是2.0的比例尺,但是和一开始的定位不对,肯定就是span的错了,那么想法弄到最原始的span的两个值就搞定
- (IBAction)backAction {
//将用户的位置 设置为地图的中心点的经纬度
self.mapView.centerCoordinate = self.mapView.userLocation.coordinate;
//改善 确定区域:1.中心点经纬度 2.经纬度跨度
/*
region:
跨度结构体(span):
typedef struct {
CLLocationDegrees latitudeDelta;
CLLocationDegrees longitudeDelta;
} MKCoordinateSpan;
//区域结构体(region)
typedef struct {
CLLocationCoordinate2D center;
MKCoordinateSpan span;
} MKCoordinateRegion;
*/
//跨度 CLLocationDegrees latitudeDelta = double
MKCoordinateSpan span = MKCoordinateSpanMake(2.0, 2.0);
//给mapView的region赋值
self.mapView.region = MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span);
}
求地图定位的时候span两个值的大小 想都不用想 肯定是代理方法
//地图区域一旦改变 就会调用
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
NSLog(@"longitudeDelta = %f,latitudeDelta = %f",self.mapView.region.span.longitudeDelta,self.mapView.region.span.latitudeDelta);
}
打印出来得出结果 longitudeDelta = 0.015407,latitudeDelta = 0.021045 这就是我们需要的两个span值
修改span
MKCoordinateSpan span = MKCoordinateSpanMake(0.015407, 0.021045);
缩小地图 span的两个值就变大 放大就变小 比例尺吗 越清晰表明比例越小
变化的时候让其有动画效果--要用动画的时候,先看看有没有系统自己的,系统的无非都是set带动画,找一下,如果还没有,自己加一个动画,我前面写过UIView的那些动画,这里都可以用上.
[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span) animated:true];
增加放大缩小按钮###
拖线方法
//改变地图大小的按钮
- (IBAction)changeMap:(UIButton *)sender {
switch (sender.tag) {
case 1:{//放大 地图的跨度中的经纬度 * 0.5
//修改当前跨度
//纬度跨度
CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;
//经度跨度
CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 0.5;
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:true];
break;
}
case 2:{//缩小 地图的跨度中的经纬度 * 2
//修改当前跨度
//纬度跨度
CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 2;
//经度跨度
CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 2;
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:true];
break;
}
default:
break;
}
}
这里重点有两个 1,你要确定的中心点位置,千万不要写成self.mapView.userLocation.coordinate这个,你是以当前用户定位所在为中心点,你看别处的时候相放大就会回到定位位置,所以你要清晰的知道 中心点是当前地图的中心self.mapView.centerCoordinate 2,还是放大缩小比例尺的逻辑问题,错了没事,弄错只会相反嘛,改过就是了.
本文不针对任何学术性研究,单纯为了娱乐.看不惯我就直说,反正我不改.
宝剑锋从磨砺出,梅花香自苦寒来.