iOS地图----MapKit框架
1.MapKit框架使用前提
①导入框架
②导入主头文件
#import <MapKit/MapKit.h>
③MapKit框架使用须知
- MapKit框架中所有数据类型的前缀都是MK
- MapKit有一个比较重要的UI控件,专门用于地图显示
④MapKit框架包含CLLocation
2.设置地图的类型
可以通过设置MKMapView的mapType设置地图类型
typedef enum : NSUInteger {
MKMapTypeStandard , 标准(默认)
MKMapTypeSatellite ,卫星
MKMapTypeHybrid 混合(标准 + 卫星)
} MKMapType;
3.追踪用户的位置,地图放大显示
注意:
在iOS8中, 如果想要追踪用户的位置, 必须自己主动请求隐私权限- 在CLLocation框架中CLLocationManager请求授权
- 利用MapKit获取用户的位置, 可以追踪
- userTrackingMode
/*
typedef NS_ENUM(NSInteger, MKUserTrackingMode) {
MKUserTrackingModeNone = 0, 不追踪/不准确的
MKUserTrackingModeFollow, 追踪
MKUserTrackingModeFollowWithHeading, 追踪并且获取用的方向
}
*/
self.mapView.userTrackingMode = MKUserTrackingModeFollow;
4.设代理,实现代理方法
self.mapView.delegate = self;
代理方法:
①地图的区域改变完成时调用
- 在此方法中可以得到用户的当前位置的mapView的中心点和经纬度跨度
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
MKCoordinateRegion region = mapView.region;
// 经纬度跨度
MKCoordinateSpan span = region.span;
NSLog(@"latitudeDelta = %f", span.latitudeDelta);
NSLog(@"longitudeDelta = %f", span.longitudeDelta);
}
②常见的代理方法有
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;
//一个位置更改默认只会调用一次,不断监测用户的当前位置
每次调用,都会把用户的最新位置(userLocation参数)传进来
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
//地图的显示区域即将发生改变的时候调用
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
//地图的区域改变完成时调用
设置地图显示区域,和经纬度跨度
①通过MKMapView的下列方法,可以设置地图显示的位置和区域
// 设置地图的中心点位置
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
// 设置地图的显示区域
@property (nonatomic) MKCoordinateRegion region;
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
②MKCoordinateRegion
//MKCoordinateRegion是一个用来表示区域的结构体,定义如下
typedef struct {
CLLocationCoordinate2D center; // 区域的中心点位置
MKCoordinateSpan span; // 区域的跨度
} MKCoordinateRegion;
//MKCoordinateSpan的定义
typedef struct {
CLLocationDegrees latitudeDelta; // 纬度跨度
CLLocationDegrees longitudeDelta; // 经度跨度
} MKCoordinateSpan;
例:回到当前位置
// 1.拿到用户的经纬度
CLLocationCoordinate2D userCoordinate = self.mapView.userLocation.coordinate;
// 2.设置地图的中心点坐标是用户的经纬度
// 2.1第一种设置方法
// [self.mapView setCenterCoordinate:userCoordinate animated:YES];
// 2.2第二种设置方法
/*
span 可以在地图的区域改变完成时调用
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
*/
MKCoordinateSpan span = {1.0, 1.0};
MKCoordinateRegion region = {userCoordinate, span};
[self.mapView setRegion:region animated:YES];
5.大头针
- 钉在某个具体位置,用来标识这个位置上有特定的事物(比如这个位置上有家餐馆)
①大头针的基本操作
// 添加一个大头针
- (void)addAnnotation:(id <MKAnnotation>)annotation;
// 添加多个大头针
- (void)addAnnotations:(NSArray *)annotations;
// 移除一个大头针
- (void)removeAnnotation:(id <MKAnnotation>)annotation;
// 移除多个大头针
- (void)removeAnnotations:(NSArray *)annotations;
(id )annotation参数是什么东西?
大头针模型对象:用来封装大头针的数据,比如大头针的位置、标题、子标题等数据
②大头针模型
- 遵守协议的任何模型对象
- 为了改写协议中
属性
--变量的值,重写这些变量- 这里的
属性
,只是为了定义get和set方法,不是所谓的传统属性
- 这里的
/**
* 大头针的位置
*/
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
/**
* 大头针标题
*/
@property (nonatomic, copy) NSString *title;
/**
* 大头针的子标题
*/
@property (nonatomic, copy) NSString *subtitle;
③添加大头针
创建大头针模型,给成员变量赋值
// 创建大头针模型
YLAnnotation *anno = [[YLAnnotation alloc] init];
anno.title = @"广东海洋大学";
anno.subtitle = @"广东省湛江市广东海洋大学";
CGFloat latitude = 24.00;
CGFloat longitude = 103.76;
anno.coordinate = CLLocationCoordinate2DMake(latitude , longitude);
添加大头针到地图上
[self.customMapView addAnnotation:anno];
6.自定义大头针
①每次添加大头针就会调用(地图上有几个大头针就调用几次)
/*
* @param mapView 地图
* @param annotation 大头针模型
*
* @return 大头针的view
*/
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation;
注意: 如果返回nil, 系统会按照自己默认的方式显示
- return nil;
创建大头针,给大头针附模型属性
- 类型 tableViewCell
static NSString *identifier = @"anno";
// 1.从缓存池中取
MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
// 2.如果缓存池中没有, 创建一个新的
if (annoView == nil) {
annoView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
// 设置大头针标题是否显示
// 自定义的大头针, 默认情况点击大头针之后是不会显示标题的, 需要我们自己手动设置显示
annoView.canShowCallout = YES;
// 设置大头针标题显示的偏移位
annoView.calloutOffset = CGPointMake(-50, 0);
// 设置大头针左边的辅助视图
annoView.leftCalloutAccessoryView = [[UISwitch alloc] init];
// 设置大头针右边的辅助视图
annoView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
}
// 设置大头针的图片
annoView.image = [UIImage imageNamed:@"category_4"];
创建另一中大头针
- MKAnnotationView的子类MKPinAnnotationView
- 新增加了从天降效果,和
static NSString *identifier = @"anno";
// 1.从缓存池中取
MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
// 2.如果缓存池中没有, 创建一个新的
if (annoView == nil) {
annoView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:identifier];
// 设置大头针的颜色
annoView.pinColor = MKPinAnnotationColorPurple;
// 设置大头针从天而降
annoView.animatesDrop = YES;
// 设置大头针标题是否显示
// 自定义的大头针, 默认情况点击大头针之后是不会显示标题的, 需要我们自己手动设置显示
annoView.canShowCallout = YES;
// 设置大头针标题显示的偏移位
annoView.calloutOffset = CGPointMake(-50, 0);
// 设置大头针左边的辅助视图
annoView.leftCalloutAccessoryView = [[UISwitch alloc] init];
// 设置大头针右边的辅助视图
annoView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
}
// 设置大头针的图片
// 注意: 如果你是使用的MKPinAnnotationView创建的自定义大头针, 那么设置图片无效, 因为系统内部会做一些操作, 覆盖掉我们自己的设置
annoView.image = [UIImage imageNamed:@"category_4"];
// 4.返回大头针View
return annoView;
自定义AnnotationView
- 类型自定义Cell
- 继承MKAnnotationView
// 每次添加大头针就会调用此方法
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
// NSLog(@"%s", __func__);
NSLog(@"annotation === %@", annotation);
// 对用户当前的位置的大头针特殊处理
if ([annotation isKindOfClass:[HMAnnotation class]] == NO) {
return nil;
}
// 1.创建自定义大头针
YLAnnotationView *annoView = [YLAnnotationView annotationViewWithMap:mapView];
// 2.设置模型(可以不赋值,系统也会自动执行这个方法)
// annoView.annotation = annotation;
// 3.返回大头针
return annoView;
}
自定义的AnnotationView中得方法
// 初始化方法
+ (instancetype)annotationViewWithMap:(MKMapView *)mapView
{
static NSString *identifier = @"anno";
// 1.从缓存池中取
YLAnnotationView *annoView = (YLAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
// 2.如果缓存池中没有, 创建一个新的
if (annoView == nil) {
// 参数传 nil 是因为 setAnnotation: 方法会赋值给Annotation模型
annoView = [[YLAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:identifier];
}
return annoView;
}
//- (void)setAnnotation:(id<MKAnnotation>)annotation
// 此方法是重写set方法
- (void)setAnnotation:(YLAnnotation *)annotation
{
[super setAnnotation:annotation];
// 处理自己特有的操作
self.image = [UIImage imageNamed:annotation.icon];
}
iOS地图----MapKit框架的更多相关文章
- iOS开发——高级篇——地图 MapKit
一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如周边:找餐馆.找KTV.找电影院等等导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达 在上述应用中,都用到了定位 ...
- IOS之【地图MapKit】
iOS地图位置开发 iPhone SDK提供了三个类来管理位置信息:CLLocation CLLocationManager 和 CLLHeading(不常用).除了使用GPS来获取当前的位置信息 ...
- iOS学习笔记20-地图(二)MapKit框架
一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...
- 【高德API】如何利用MapKit开发全英文检索的iOS地图
原文:[高德API]如何利用MapKit开发全英文检索的iOS地图 制作全英文地图的展示并不困难,但是要制作全英文的数据检索列表,全英文的信息窗口,你就没办法了吧.告诉你,我有妙招!使用iOS自带的M ...
- iOS核心笔记—MapKit框架-基础
1.MapKit框架简介: ✨了解:MapKit框架使用须知:①.MapKit框架中所有的数据类型的前缀都是MK:②.需要导入#import <MapKit/MapKit.h>头文件:③. ...
- IOS MapKit框架的使用(专门用于地图显示)
● MapKit框架使用前提 ● 导入框架 ● 导入主头文件#import <MapKit/MapKit.h> ● MapKit框架使用须知 ● MapKit框架中所有数据类型的前 ...
- iOS学习笔记-地图MapKit入门
代码地址如下:http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错漏 ...
- iOS地图
地图 1.主要用到了地图展示和定位功能 CoreLocation框架的使用: 导入头文件 #import <CoreLocation/CoreLocation.h>CoreL ...
- 史上最全的常用iOS的第三方框架
文章来源:http://blog.csdn.net/sky_2016/article/details/45502921 图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片 ...
随机推荐
- LEA指令与MOV指令的区别——发现一本汇编好书
一.汇编语言中PTR的含义及作用mov ax,bx ;是把BX寄存器“里”的值赋予AX,由于二者都是word型,所以没有必要加“WORD”mov ax,word ptr [bx];是把内存地址等于“B ...
- mysql15--垂直分表水平分表
分表技术(表的结构不能变) 分表技术有(水平分割和垂直分割) 当一张越来越大时候,即使添加索引还慢的话,我们可以使用分表 以qq用户表来具体的说明一下分表的操作. 思路如图 : 首先我创建三张表 u ...
- YTU 2907: 类重载实现矩阵加法
2907: 类重载实现矩阵加法 时间限制: 1 Sec 内存限制: 128 MB 提交: 345 解决: 164 题目描述 编写矩阵类Matrix,实现两个2x3矩阵相加.主函数已给定. 输入 两 ...
- java中一个字符串是另外一个字符串的字串
java中一个字符串是另外一个字符串的字串 String类中有一个方法 public boolean contains(Sting s)就是用来判断当前字符串是否含有参数指定的字符串例s1=“take ...
- apktool工具下载地址
apktool工具下载地址 http://ibotpeaches.github.io/Apktool/
- codeforces 688A A. Opponents(水题)
题目链接: A. Opponents time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- MkDocs -- Project documentation with Markdown
/************************************************************************ * MkDocs -- Project docume ...
- bzoj 2337 [HNOI2011]XOR和路径【高斯消元+dp】
首先,我们发现,因为是无向图,所以相连的点之间是有"依赖性"的,所以不能直接用dp求解. 因为是xor,所以按位处理,于是列线性方程组,设$ x[i] $为点i到n异或和为1的期望 ...
- 【插件开发】—— 13 GEF双击模型事件
前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭配 6 SWT复杂空间与布局搭配 7 SWT布局详解 ...
- Redis操作命令大全
一.key pattern 查询相应的key (1)redis允许模糊查询key 有3个通配符 *.?.[] (2)randomkey:返回随机key (3)type key:返回key存储的类型 ...