zoukankan      html  css  js  c++  java
  • iOS地图的显示(大头针)

     1 1.导入主头文件
     2        #import <MapKit/MapKit.h>
     3   MapKit框架使用须知
     4   MapKit框架中所有数据类型的前缀都是MK
     5   MapKit有一个比较重要的UI控件:MKMapView,专门用于地图显示
     6 
     7 2.跟踪显示用户的位置
     8 
     9     设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置    
    10     MKUserTrackingModeNone :不跟踪用户的位置
    11     MKUserTrackingModeFollow :跟踪并在地图上显示用户的当前位置
    12     MKUserTrackingModeFollowWithHeading :跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转
    13 3.地图的类型
    14 
    15 可以通过设置MKMapView的mapType设置地图类型(mapViewType是枚举类型)
    16 MKMapTypeStandard // 普通地图(左图)
    17 MKMapTypeSatellite // 卫星云图 (中图)
    18 MKMapTypeHybrid // 普通地图覆盖于卫星云图之上(右图)
    19 MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0) // 地形和建筑物的三维模型
    20 MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0) // 显示道路和附加元素的Flyover
     1 MKMapView可以设置一个代理对象,用来监听地图的相关行为,常见的代理方法有:
     2 
     3 // 一个位置更改默认只会调用一次,不断监测用户的当前位置时每次都会调用这个方法,把用户的最新位置(userLocation参数)传进来.
     4 
     5 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;
     6 
     7 // 地图的显示区域即将发生改变的时候调用
     8 - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
     9 
    10 // 地图的显示区域已经发生改变的时候调用
    11 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
    12 
    13 MKUserLocation其实是个大头针模型,包括以下属性
    14 // 显示在大头针上的标题
    15 @property (nonatomic, copy) NSString *title;
    16 
    17 // 显示在大头针上的子标题
    18 @property (nonatomic, copy) NSString *subtitle;
    19 
    20 // 地理位置信息(大头针钉在什么地方)
    21 @property (readonly, nonatomic) CLLocation *location;
    22 
    23 通过MKMapView的下列方法,可以设置地图显示的位置和区域
    24 // 设置地图的中心点位置
    25 @property (nonatomic) CLLocationCoordinate2D centerCoordinate;
    26 
    27 -(void)setCenterCoordinate: (CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
    28 
    29 @property (nonatomic) MKCoordinateRegion region;
    30 - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

    大头针模型

     1 新建一个大头针模型类
     2 #import <MapKit/MapKit.h>
     3 @interface MyAnnonation : 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 #pragma mark - 添加大头针
     2 - (void)addAnnotation
     3 {
     4     // 设置位置
     5     CLLocationCoordinate2D location1 = CLLocationCoordinate2DMake(40, 116);
     6     MyAnnotation *annotation = [[MyAnnotation alloc] init];
     7     
     8     annotation.coordinate = location1;
     9     annotation.title = @"BeiJing";
    10     annotation.subtitle = @"Myhome";
    11 #warning 添加代码
    12     annotation.image = [UIImage imageNamed:@"88"];
    13     [_mapView addAnnotation:annotation];
    14     MyAnnotation *annotation2 = [[MyAnnotation alloc] init];
    15     CLLocationCoordinate2D location2 = CLLocationCoordinate2DMake(39, 121);
    16     annotation2.coordinate = location2;
    17     annotation2.title = @"DaLian";
    18     annotation2.subtitle = @"Hishome";
    19     [_mapView addAnnotation:annotation2];
    20     MyAnnotation *annotation3 = [[MyAnnotation alloc] init];
    21 
    22     CLLocationCoordinate2D location3 = CLLocationCoordinate2DMake(34, 113);
    23     annotation3.coordinate = location3;
    24     annotation3.title = @"zhengzhou";
    25     annotation3.subtitle = @"herhome";
    26     [_mapView addAnnotation:annotation3];
    27 }
     1 // 添加一个大头针
     2 - (void)addAnnotation:(id <MKAnnotation>)annotation;
     3 
     4 
     5 // 添加多个大头针
     6 - (void)addAnnotations:(NSArray *)annotations;
     7 
     8 // 移除一个大头针
     9 - (void)removeAnnotation:(id <MKAnnotation>)annotation;
    10 
    11 // 移除多个大头针
    12 - (void)removeAnnotations:(NSArray *)annotations;

    自定义大头针

     1 设置MKMapView的代理
     2 实现下面的代理方法,返回大头针控件
     3 
     4 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
     5 根据传进来的(id <MKAnnotation>)annotation参数创建并返回对应的大头针控件
     6 代理方法的使用注意
     7 如果返回nil,显示出来的大头针就采取系统的默认样式
     8 
     9 标识用户位置的蓝色发光圆点,它也是一个大头针,当显示这个大头针时,也会调用代理方法
    10 
    11 因此,需要在代理方法中分清楚(id <MKAnnotation>)annotation参数代表自定义的大头针还是蓝色发光圆点
    12 地图上的大头针控件是MKAnnotationView
    13 
    14 MKAnnotationView的属性
    15 
    16 // 大头针模型
    17 @property (nonatomic, strong) id <MKAnnotation> annotation;
    18 
    19 // 显示的图片
    20 @property (nonatomic, strong) UIImage *image;
    21 
    22 // 是否显示标注
    23 @property (nonatomic) BOOL canShowCallout;
    24 
    25 // 标注的偏移量
    26 @property (nonatomic) CGPoint calloutOffset;
    27 // 标注右边显示什么控件
    28 @property (strong, nonatomic) UIView *rightCalloutAccessoryView;
    29 
    30 // 标注左边显示什么控件
    31 @property (strong, nonatomic) UIView *leftCalloutAccessoryView;
    32 
    33 MKPinAnnotationView是MKAnnotationView的子类
    34 
    35 MKPinAnnotationView比MKAnnotationView多了2个属性
    36 
    37 // 大头针颜色
    38 @property (nonatomic) MKPinAnnotationColor pinColor;
    39 
    40 // 大头针第一次显示时是否从天而降
    41 @property (nonatomic) BOOL animatesDrop;
    42 
    43 CLLocationManager 定位的基础信息 
    44 CLLocation  位置的地理信息
    45 CLLocationCoordinate2D  存放经纬度的结构体
    46 CLGeocoder地理位置编码与反编码的类
    47 CLPlacemark 地标.
    48 MKMapView 基础地图 
    49 MKUserLocation  大头针模型
    50 MKCoordinateRegion  显示区域的结构体
    51 MKAnnotationView 自定义大头针控件
      1 #import "ViewController.h"
      2 
      3 // 地图使用的框架是MapKit
      4 // 引入框架
      5 #import <MapKit/MapKit.h>
      6 #import <CoreLocation/CoreLocation.h>
      7 #import "MyAnnotation.h"
      8 @interface ViewController ()<MKMapViewDelegate>
      9 
     10 // 定位管理器
     11 @property (nonatomic, strong) CLLocationManager *locationManager;
     12 
     13 // 显示地图的视图
     14 @property (nonatomic, strong) MKMapView *mapView;
     15 @end
     16 
     17 @implementation ViewController
     18 
     19 - (void)viewDidLoad {
     20     [super viewDidLoad];
     21     // Do any additional setup after loading the view, typically from a nib.
     22     /*
     23     大头针:
     24     在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的“大头针”。只要一个NSObject类实现MKAnnotation协议就可以作为一个大头针,通常会重写协议中coordinate(标记位置)、title(标题)、subtitle(子标题)三个属性,然后在程序中创建大头针对象并调用addAnnotation:方法添加大头针即可(之所以iOS没有定义一个基类实现这个协议供开发者使用,多数原因应该是MKAnnotation是一个模型对象,对于多数应用模型会稍有不同,例如后面的内容中会给大头针模型对象添加其他属性)。
     25     */
     26     // 创建视图
     27     [self createMapView];
     28 
     29 }
     30 
     31 #pragma mark - 创建视图
     32 - (void)createMapView
     33 {
     34     // 创建地图,并添加到当前视图上
     35     self.mapView = [[MKMapView alloc] initWithFrame:[UIScreen mainScreen].bounds];
     36     [self.view addSubview:self.mapView];
     37     // 设置代理
     38     _mapView.delegate = self;
     39     
     40     // 定位的设置
     41     self.locationManager = [[CLLocationManager alloc] init];
     42     // 判断是否可用
     43     if (![CLLocationManager locationServicesEnabled]) {
     44         NSLog(@"当前设备定位不可用");
     45     }
     46     //
     47     if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) {
     48         [self.locationManager requestWhenInUseAuthorization];
     49     }
     50     
     51     // 设置地图的定位追踪
     52     _mapView.userTrackingMode = MKUserTrackingModeFollow;
     53     
     54     // 设置地图的类型
     55     _mapView.mapType = MKMapTypeStandard;
     56     
     57     // 添加大头针
     58     [self addAnnotation];
     59     
     60 }
     61 
     62 #pragma mark - 添加大头针
     63 - (void)addAnnotation
     64 {
     65     // 设置位置
     66     CLLocationCoordinate2D location1 = CLLocationCoordinate2DMake(40, 116);
     67     MyAnnotation *annotation = [[MyAnnotation alloc] init];
     68     
     69     annotation.coordinate = location1;
     70     annotation.title = @"BeiJing";
     71     annotation.subtitle = @"Myhome";
     72 #warning 添加代码
     73     annotation.image = [UIImage imageNamed:@"88"];
     74     [_mapView addAnnotation:annotation];
     75     MyAnnotation *annotation2 = [[MyAnnotation alloc] init];
     76     CLLocationCoordinate2D location2 = CLLocationCoordinate2DMake(39, 121);
     77     annotation2.coordinate = location2;
     78     annotation2.title = @"DaLian";
     79     annotation2.subtitle = @"Hishome";
     80     [_mapView addAnnotation:annotation2];
     81     MyAnnotation *annotation3 = [[MyAnnotation alloc] init];
     82 
     83     CLLocationCoordinate2D location3 = CLLocationCoordinate2DMake(34, 113);
     84     annotation3.coordinate = location3;
     85     annotation3.title = @"zhengzhou";
     86     annotation3.subtitle = @"herhome";
     87     [_mapView addAnnotation:annotation3];
     88 }
     89 
     90 #pragma mark - 代理方法
     91 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
     92 {
     93     NSLog(@"=====%@", userLocation);
     94 }
     95 
     96 #pragma mark - 实现自定义大头针视图的代理方法
     97 // 显示大头针的时候才会调用
     98 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
     99 {
    100     // 判断是否是当前自定义的大头针类
    101     if ([annotation isKindOfClass:[MyAnnotation class]]) {
    102         
    103         // 先定义一个重用标识
    104         static NSString *identifier = @"Annotation";
    105         MKAnnotationView *annotationView =[_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    106         // 重用机制
    107         if (!annotationView) {
    108             annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    109             // 允许用户交互
    110             annotationView.canShowCallout = YES;
    111             // 设置详情和大头针的头偏移量
    112             annotationView.calloutOffset = CGPointMake(0, 1);
    113             // 设置详情的左视图
    114             annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"88"]];
    115             
    116         }
    117         // 修改大头针视图
    118 
    119         annotationView.annotation = annotation;
    120         // 强转
    121         annotationView.image = ((MyAnnotation *)annotation).image;
    122         
    123         return annotationView;
    124         
    125         
    126     } else {
    127         return nil;
    128     }
    129 }
  • 相关阅读:
    幂等性
    merge效率
    云化
    流量、带宽、速度、码率
    缓存一致性与可见性
    kernel32.dll 这个系统模块
    C#ModBus Tcp
    Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)
    Spring MVC-集成(Integration)-生成PDF示例(转载实践)
    Spring MVC-集成(Integration)-生成Excel示例(转载实践)
  • 原文地址:https://www.cnblogs.com/leikun1113/p/5548003.html
Copyright © 2011-2022 走看看