地图大头针的高级操作

一、地图显示

1、使用到的框架及相关类

 MapKit框架中MKMapView

2、MKMapView的常用属性

 1)跟踪类型

   userTrackingMode 

 2)地图类型

   mapType

 3)用户位置,只读属性

   userLocation

 4)当前地图中的所有大头针,只读属性

   annotations

 5)是否可以缩放

   zoomEnabled = NO

 6)是否可以滚动 

   scrollEnabled = NO 

 7)是否可以旋转  

   rotateEnabled = NO;

 8)是否显示3D  

   pitchEnabled = NO

 9)是否显示指南针

   showsCompass = YES

 10)是否显示比例尺

   showsScale = YES

 11)是否显示交通

   showsTraffic = YES

 12)是否显示建筑物

   showsBuildings = YES

3、MKMapView的常用方法

 1)添加大头针

   addAnnotation

 2)删除大头针

   removeAnnotation

 3)设置地图显示区域,用于控制当前屏幕显示地图范围

   setRegion

 4)设置地图中心点位置

   setCenterCoordinate

 5)将地理坐标(经纬度)转化为数学坐标(UIKit坐标)

   convertCoordinate

 6)将数学坐标转换为地理坐标

   convertPoint

 7)从缓存池中取出大头针

   dequeueReusableAnnotationViewWithIdentifier

 8)选中指定的大头针

   selectAnnotation

 9)取消选中指定的大头针

   deselectAnnotation

4、代理方法

 1)用户位置发生改变时触发

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

 2)显示区域发生改变后触发

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

 3)地图加载完成后触发

   - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView

 4)显示大头针时触发,返回大头针视图,通常自定义大头针可以通过此方法进行

   - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

 5)点击选中某个大头针时触发

   - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

 6)取消选中大头针时触发

   - (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view

 7)渲染地图覆盖物时触发

   - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay

二、在地图上显示自己位置

1、导入MapKit框架

 #import <MapKit/MapKit.h>

2、使用定位管理器CLLocationManager做定位授权

 [_locationManager requestWhenInUseAuthorization];

3、创建MKMapView地图试图,并添加到他的父试图上面,我的_mapView已设为全局变量

  _mapView = [[MKMapView alloc]initWithFrame:self.view.frame];
  [self.view addSubview:_mapView];

4、设置相应属性

  //地图类型
  _mapView.mapType = MKMapTypeStandard;

  //跟踪类型
  _mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;

5、挂代理

  _mapView.delegate = self;

6、显示用户位置

  _mapView.showsUserLocation = YES;

7、实现代理方法

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

    CLLocationCoordinate2D 设置该区域的中心点

    MKCoordinateSpan 设置该区域的经纬度跨度

    例如:中国经纬度

    经度范围:73.33E 至 135.05E
    纬度范围:2.51N  至 53.33N

  }

PS:总结,如果无法显示自己的位置,检查以下几点:

 1、是否将定位管理器设为全局变量

 2、是否在项目中进行定位授权,是否在Info.plist中配置

 3、是否将showsUserLocation设为YES。

 4、是否配置模拟器 点击模拟器 -> 菜单栏Dubug -> Location -> Apple来使模拟器定位,然后使用Custom Location配置模拟器的经纬度。

三、自定义用户位置的大头针

1、地图上用来显示当前位置信息的点,其实就是一个大头针,接下来我们要自定义这个大头针的样式

2、使用的框架及相关类

 1)MPAnnotationView,属于MapKit框架

   大头针试图,能够自定义,用户当前位置的大头针默认样式是一个原点,非用户当前位置的大头针,系统默认用一个类似图钉样式的试图显示

 2)MKAnotation,属于MapKit框架

   大头针的数据模型,只要一个NSObject类实现MKAnnotation协议就可以作为一个大头针数据模型、通常重写协议中的coordinate(位置,必须实现的)、title标题、subtitle(子标题)三个属性来自定义大头针的数据模型

 3) MKUserLocation

   系统定义的大头针数据模型专门用来表示用户当前位置大头针上的数据模型,遵守了MKAnnotation协议。

3、MPAnnotationView相关属性

  1)初始化

     initWithAnnotation:reuseIdentifier:

  2)设置大头针图片

     image 

  3)中心点的偏移量 x正右 y正下

     centerOffset 
        
  4)插图的偏移量

     calloutOffset 

  5)是否选中

     selected 
  
  6)设置是否可以显示 插入视图

     canShowCallout 

  7)左侧插入视图的附加视图

     leftCalloutAccessoryView 
  
  8)右侧插入视图的附加视图

     rightCalloutAccessoryView:
  
  9)插入视图的详细视图

     detailCalloutAccessoryView 
  
  10)是否可以拖拽

     draggable 
       
  11)拖拽的状态

     dragState 

4、MKAnotation相关属性

 1)coordinate 经纬度

 2)title  标题

 3) subtitle 子标题

3、给地图试图添加大头针的原理如下:

 1)准备大头针试图模型

 2)使用地图试图调用addAnnotaion给地图试图添加大头针数据模型

 3)然后MKMapView会将数据模型传给一个代理方法,该代理方法会将该大头针数据模型包装到一个大头针试图,然后返回该大头针试图、返回的带有数据模型的大头针试图便会显示在地图上,如果返回为nil,则系统会默认一个大头针试图显示在上面

四、长按添加大头针

一、需求:

1、批量、分类添加大头针

2、大头针样式设置

1) MKAnnotationView

   不能设置大头针的颜色
   不能设置动画效果
   能够自定义大头针的图片

2)MKPinAnnotationView

   继承MKAnnotationView
   可以设置糖的颜色
   可以设置动画效果
   不能给自定义大头针的图片

3、即自定义大头针的图片又实现动画效果

 //大头针显示在试图上时调用,我在这里给大头针设置显示动画
 - (void) mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {

  //获取到mapview的frame
  CGRect visibleRect = _mapView.frame;

  for (MKAnnotationView *view in views) {
    
    CGRect endFrame = view.frame;
    CGRect startFrame = endFrame;
    startFrame.origin.y = visibleRect.origin.y - startFrame.size.height;
    view.frame = startFrame;
    
    [UIView animateWithDuration:1 animations:^{
       
         view.frame = endFrame;
    }];
    
   }
 }

3、自定义大头针试图

4、点击大头针的辅助图标

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容