一、需求
效果图.png-
1.设计: 将用户当前位置,显示在地图中间,而且点击蓝色点,弹出大头针
-
2.实现步骤:
- 查看当前⽤用户位置信息
- 设置地图代理,并实现代理⽅方法,在代理⽅方法中获取⽤用户当前位置(注意:iOS8.0之后要请求授权!!)
- 将地图显⽰示中⼼心调整为⽤用户当前所在位置(iOS8.0之前,地图不会⾃自动移动到⽤用户所在位置)
- 调整当前地图显⽰示的区域(可使⽤用对应代理⽅方法查看当前地图跨度,然后调整到合适跨度即可)
- 查看当前⽤用户位置信息
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
/**
MKUserLocation : 被称作“大头针模型”,其实喊什么都行,本质就是一个数据模型,只不过此模型遵循了大头针要遵循的协议(MKAnnotation)
location: 用户当前所在位置信息(CLLocation对象)
title: 大头针标注要显示的标题(NSString对象)
subtitle: 大头针标注要显示的子标题(NSString对象)
*/
// 根据用户当前位置的经纬度,设置地图显示中心
/**
存在弊端:地图显示比例过大,无法调整
解决方案:直接使用对应的调整地图“显示区域”的API
*/
// [mapView setCenterCoordinate:userLocation.coordinate animated:YES];
/**
MKCoordinateSpan 跨度解释:
latitudeDelta:纬度跨度,因为南北纬各90度,所以此值的范围是(0---180);此值表示,整个地图视图宽度,显示多大跨度
longitudeDelta:经度跨度,因为东西经各180度,所以此值范围是(0---360):此值表示,整个地图视图高度,显示多大跨度
注意:地图视图显示,不会更改地图的比例,会以地图视图高度或宽度较小的那个为基准,按比例调整
*/
// MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);
// MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.coordinate, span);
// [mapView setRegion:region animated:YES];
}
// 当地图区域(跨度)改变时调用
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
}
二、完整实例:
- 代码实现:
#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
/** 位置管理者 */
@property (nonatomic, strong) CLLocationManager *locationM;
@end
@implementation ViewController
#pragma mark -懒加载
-(CLLocationManager *)locationM
{
if (!_locationM) {
_locationM = [[CLLocationManager alloc] init];
// 版本适配
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
[_locationM requestAlwaysAuthorization];
}
}
return _locationM;
}
- (void)viewDidLoad {
[super viewDidLoad];
// MKMapTypeStandard = 0, // 标准地图
// MKMapTypeSatellite, // 卫星云图
// MKMapTypeHybrid, // 混合(在卫星云图上加了标准地图的覆盖层)
// MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体
// MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D混合
// 设置地图显示样式(必须注意,设置时 注意对应的版本)
self.mapView.mapType = MKMapTypeStandard;
// 设置地图的控制项
// 是否可以滚动
// self.mapView.scrollEnabled = NO;
// 缩放
// self.mapView.zoomEnabled = NO;
// 旋转
// self.mapView.rotateEnabled = NO;
// 设置地图的显示项(注意::版本适配)
// 显示建筑物
self.mapView.showsBuildings = YES;
// 指南针
self.mapView.showsCompass = YES;
// 兴趣点
self.mapView.showsPointsOfInterest = YES;
// 比例尺
self.mapView.showsScale = YES;
// 交通
self.mapView.showsTraffic = YES;
// 显示用户位置
[self locationM];
// 显示用户位置, 但是地图并不会自动放大到合适比例
self.mapView.showsUserLocation = YES;
/**
* MKUserTrackingModeNone = 0, 不追踪
MKUserTrackingModeFollow, 追踪
MKUserTrackingModeFollowWithHeading, 带方向的追踪
*/
// 不但显示用户位置, 而且还会自动放大地图到合适的比例(也要进行定位授权)
// 不灵光
// self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
}
#pragma mark -MKMapViewDelegate
/**
* 当地图获取到用户位置时调用
*
* @param mapView 地图
* @param userLocation 大头针数据模型
*/
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
/**
* MKUserLocation : 专业术语: 大头针模型 其实喊什么都行, 只不过这个类遵循了大头针数据模型必须遵循的一个协议 MKAnnotation
// title : 标注的标题
// subtitle : 标注的子标题
*/
userLocation.title = @"标题";
userLocation.subtitle = @"子标题";
// 移动地图的中心,显示用户的当前位置
// [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
// 显示地图的显示区域
// 控制区域中心
CLLocationCoordinate2D center = userLocation.location.coordinate;
// 设置区域跨度
MKCoordinateSpan span = MKCoordinateSpanMake(0.077919, 0.044529);
// 创建一个区域
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
// 设置地图显示区域
[mapView setRegion:region animated:YES];
}
/**
* 地图区域已经改变时带哦用
*
* @param mapView 地图
* @param animated 动画
*/
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
}
/**
* 地图区域将要改变时带哦用
*
* @param mapView 地图
* @param animated 动画
*/
-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
}
@end
网友评论