在storyBoard中使用到非UIKit的框架,要在项目的TARGETS-->General-->Linked Frameworks and Libraries中点击+号添加MapKit框架,遵守MKMapViewDelegate协议
@interface ViewController ()
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic, strong) CLLocationManager *locationManager;
@end
// 1.请求用户授权
// 创建对象并请求授权
self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager requestWhenInUseAuthorization];
/*
MKMapTypeStandard 标准地图
MKMapTypeSatellite 卫星地图
MKMapTypeHybrid 鸟瞰地图
MKMapTypeSatelliteFlyover
MKMapTypeHybridFlyover
*/
// 设置地图类型
self.mapView.mapType = MKMapTypeStandard;
// 实时的交通情况 -->iOS9新增方法
self.mapView.showsTraffic = YES;
// 2.用户跟踪模式
/*
MKUserTrackingModeNone 无
MKUserTrackingModeFollow 跟踪位置
MKUserTrackingModeFollowWithHeading 跟踪位置并跟踪方向
*/
self.mapView.userTrackingMode = MKUserTrackingModeFollow;
// 3.设置代理
self.mapView.delegate = self;
确定当前位置(region-->MKCoordinateRegion)
确定一个区域和确定一个圆类似,需要且只需要确定两个元素:1.中心点经纬度CLLocationCoordinate2D-->self.mapView.userLocation.coordinate 2.经纬度跨度span-->MKCoordinateSpan 两个都是结构体,直接make。
如何确定系统默认经纬度跨度 --> 在mapView的代理方法regionDidChangeAnimated中,当地图区域改变时回自动调用,在此方法中打印经纬度跨度。
如果需要动画回到当前位置,调用mapView的 setRegion: animated:
当区域改变的时候调用
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
NSLog(@"latitudeDelta:%f longitudeDelta:%f",mapView.region.span.latitudeDelta,mapView.region.span.longitudeDelta);
}
方法
点击按钮回到初始位置
- (IBAction)backToCurrentLocation:(id)sender
{
// self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
// 区域 region --两个结构体 center span
// center 经度和纬度
// span 经度跨度和纬度跨度
// 当前区域的中心点经纬度
CLLocationCoordinate2D center = self.mapView.userLocation.location.coordinate;
// 当前区域的经纬度跨度
MKCoordinateSpan span = MKCoordinateSpanMake(0.021251, 0.016093);
// 确定区域
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
// self.mapView.region = region;
// 加入系统动画
[self.mapView setRegion:region animated:YES];
}
放大和缩小地图其实就是:"当前"地图显示的中心点经纬度不变,经纬度跨度(span)缩小或增大2倍;
注意:在回到当前位置设置region时的中心点经纬度是定位到用户的经纬度(userLocation),而放大缩小地图的中心点经纬度是当前地图界面的中心点经纬度。
点击按钮放大地图
// 放大地图
- (IBAction)biggerMap:(id)sender
{
// 纬度跨度
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:YES];
}
点击按钮缩小地图
- (IBAction)smallerMap:(id)sender
{
// 纬度跨度
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:YES];
}