zoukankan      html  css  js  c++  java
  • iOS开发之MapKit

    MapKit框架的使用

    导入框架

     

    导入主头文件

    #import <MapKit/MapKit.h>

    MapKit框架使用须知

    MapKit框架中所有数据类型的前缀都是MK

    MapKit有一个比较重要的UI控件 MKMapView,专门用于地图显示

    跟踪显示用户的位置

    设置MKMapViewuserTrackingMode属性可以跟踪显示用户的当前位置

    MKUserTrackingModeNone :不跟踪用户的位置

    MKUserTrackingModeFollow :跟踪并在地图上显示用户的当前位置

    MKUserTrackingModeFollowWithHeading :跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转

     

    下图是跟踪效果

    蓝色发光圆点就是用户的当前位置

    蓝色发光原点,专业术语叫做大头针

     

    地图的类型

    可以通过设置MKMapViewmapViewType设置地图类型

    MKMapTypeStandard :普通地图(左图)

    MKMapTypeSatellite :卫星云图 (中图)

    MKMapTypeHybrid :普通地图覆盖于卫星云图之上(右图) 

                    

     

    MKMapView的代理

    MKMapView可以设置一个代理对象,用来监听地图的相关行为

     

    常见的代理方法有

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

    调用非常频繁,不断监测用户的当前位置

    每次调用,都会把用户的最新位置(userLocation参数)传进来

     1 - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated; 

    地图的显示区域即将发生改变的时候调用

     1 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; 

    地图的显示区域已经发生改变的时候调用

    MKUserLocation

    MKUserLocation其实是个大头针模型,包括以下属性

     1 @property (nonatomic, copy) NSString *title; 

    显示在大头针上的标题

     1 @property (nonatomic, copy) NSString *subtitle; 

    显示在大头针上的子标题

     1 @property (readonly, nonatomic) CLLocation *location; 

    地理位置信息(大头针钉在什么地方?)

    设置地图的显示

    通过MKMapView的下列方法,可以设置地图显示的位置和区域

    设置地图的中心点位置

    1 @property (nonatomic) CLLocationCoordinate2D centerCoordinate;
    2 
    3 - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;

    设置地图的显示区域

    1 @property (nonatomic) MKCoordinateRegion region;
    2 
    3 - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

    MKCoordinateRegion

    MKCoordinateRegion是一个用来表示区域的结构体,定义如下

    1 typedef struct {
    2 
    3       CLLocationCoordinate2D center; // 区域的中心点位置
    4 
    5       MKCoordinateSpan span; // 区域的跨度
    6 
    7 } MKCoordinateRegion;

    MKCoordinateSpan的定义

    1 typedef struct {
    2 
    3     CLLocationDegrees latitudeDelta; // 纬度跨度
    4 
    5     CLLocationDegrees longitudeDelta; // 经度跨度
    6 
    7 } MKCoordinateSpan;

    大头针

    什么是大头针

    现实生活中的大头针

    地图上的大头针

    钉在某个具体位置,用来标识这个位置上有特定的事物(比如这个位置上有家餐馆)

    大头针的基本操作

    添加一个大头针

    - (void)addAnnotation:(id <MKAnnotation>)annotation;

    添加多个大头针

    - (void)addAnnotations:(NSArray *)annotations;

    移除一个大头针

    - (void)removeAnnotation:(id <MKAnnotation>)annotation;

     移除多个大头针

    - (void)removeAnnotations:(NSArray *)annotations;

    (id <MKAnnotation>)annotation参数是什么东西?

    大头针模型对象:用来封装大头针的数据,比如大头针的位置、标题、子标题等数据

    大头针模型

    新建一个大头针模型类

     1 #import <MapKit/MapKit.h>
     2 
     3 @interface MJTuangouAnnotation : NSObject <MKAnnotation>
     4 /** 坐标位置 */
     5 @property (nonatomic, assign) CLLocationCoordinate2D coordinate;
     6 /** 标题 */
     7 @property (nonatomic, copy) NSString *title; 
     8 /** 子标题 */
     9 @property (nonatomic, copy) NSString *subtitle; 
    10 @end

    添加大头针

    1 MJTuangouAnnotation *anno = [[MJTuangouAnnotation alloc] init];
    2 anno.title = @"你怎么看";
    3 anno.subtitle = @"我趴窗户上看";
    4 anno.coordinate = CLLocationCoordinate2DMake(40, 116);
    5 [self.mapView addAnnotation:anno];

    自定义大头针

    很多情况下,需要自定义大头针的显示样式,比如显示一张图片

     

    自定义大头针

    如何自定义大头针

    设置MKMapView的代理

    实现下面的代理方法,返回大头针控件

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

    根据传进来的(id <MKAnnotation>)annotation参数创建并返回对应的大头针控件

     

    代理方法的使用注意

    如果返回nil,显示出来的大头针就采取系统的默认样式

    标识用户位置的蓝色发光圆点,它也是一个大头针,当显示这个大头针时,也会调用代理方法

    因此,需要在代理方法中分清楚(id <MKAnnotation>)annotation参数代表自定义的大头针还是蓝色发光圆点

     1 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
     2 {
     3     // 判断annotation的类型
     4     if (![annotation isKindOfClass:[MJTuangouAnnotation class]]) return nil;
     5     
     6     // 创建MKAnnotationView
     7     static NSString *ID = @"tuangou";
     8     MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];
     9     if (annoView == nil) {
    10         annoView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
    11         annoView.canShowCallout = YES;
    12     }
    13     // 传递模型数据
    14     annoView.annotation = annotation;
    15     
    16     // 设置图片
    17         MJTuangouAnnotation *tuangouAnnotation = annotation;
    18     annoView.image = [UIImage imageNamed:tuangouAnnotation.icon];
    19     
    20     return annoView;
    21 }

    MKAnnotationView

    地图上的大头针控件是MKAnnotationView

     MKAnnotationView的属性

     1 @property (nonatomic, strong) id <MKAnnotation> annotation;
     2 大头针模型
     3 
     4 @property (nonatomic, strong) UIImage *image;
     5 显示的图片
     6 
     7 @property (nonatomic) BOOL canShowCallout;
     8 是否显示标注
     9 
    10 @property (nonatomic) CGPoint calloutOffset;
    11 标注的偏移量
    12 
    13 @property (strong, nonatomic) UIView *rightCalloutAccessoryView;
    14 标注右边显示什么控件
    15 
    16 @property (strong, nonatomic) UIView *leftCalloutAccessoryView;
    17 标注左边显示什么控件

    MKPinAnnotationView

    MKPinAnnotationViewMKAnnotationView的子类

    MKPinAnnotationViewMKAnnotationView多了2个属性

    1 @property (nonatomic) MKPinAnnotationColor pinColor;
    2 大头针颜色
    3 
    4 @property (nonatomic) BOOL animatesDrop;
    5 大头针第一次显示时是否从天而降
  • 相关阅读:
    AJAX异步传输——以php文件传输为例
    js控制json生成菜单——自制菜单(一)
    vs2010中关于HTML控件与服务器控件分别和js函数混合使用的问题
    SQL数据库连接到服务器出错——无法连接到XXX
    PHP错误:Namespace declaration statement has to be the very first statement in the script
    【LeetCode】19. Remove Nth Node From End of List
    【LeetCode】14. Longest Common Prefix
    【LeetCode】38. Count and Say
    【LeetCode】242. Valid Anagram
    【LeetCode】387. First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/dongwenbo/p/4299789.html
Copyright © 2011-2022 走看看