iOS 原生地图 开发
iOS开发有时候用到地图,不少人第一想到的是用第三方。当然有时候为了和安卓同步,可能会一起使用某一第三方。但有时候,我们是可以用原生地图开发的。上面两个示意图是原生地图的自定义开发。
运行demo,将展现图一界面,蓝色点是用户本人位置,弹出的大头针 是自己自定义 样式,另外 大头针是居中显示,我们同时可以设定地图放大的level效果。[maMapView setCenterCoordinate:location1 zoomLevel:10 animated:NO]; 我默认设置了 10, 你可以改变这个值,试试其他效果。
下面是核心代码以及git地址:
- //
- // MapViewController.m
- // MapDemo
- //
- // Copyright © 2016年 qiye. All rights reserved.
- //
- #define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
- #define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
- #import "MapViewController.h"
- #import <CoreLocation/CoreLocation.h>
- #import <MapKit/MapKit.h>
- #import <MapKit/MKAnnotationView.h>
- #import "QYAnnotation.h"
- #import "MKMapView+ZoomLevel.h"
- #import "DestinationMode.h"
- @interface MapViewController ()<MKMapViewDelegate>
- @end
- @implementation MapViewController{
- UIView * uiView;
- CLLocationManager * locationManager;
- MKMapView * maMapView;
- MKAnnotationView * annotationView;
- DestinationMode * destinationMode;
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.title = @"地图使用";
- [self initMap];
- }
- -(void) initMap
- {
- destinationMode = [DestinationMode initWithName:@"上海政府" desc:@"对,就是这个地方!" latitude:@"31.230344" longitude:@"121.47411346"];
- maMapView=[[MKMapView alloc]initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64)];
- [self.view addSubview:maMapView];
- //设置代理
- maMapView.delegate=self;
- //请求定位服务
- locationManager=[[CLLocationManager alloc]init];
- if(![CLLocationManager locationServicesEnabled]||[CLLocationManager authorizationStatus]!=kCLAuthorizationStatusAuthorizedWhenInUse){
- [locationManager requestWhenInUseAuthorization];
- }
- //用户位置追踪(用户位置追踪用于标记用户当前位置,此时会调用定位服务)
- maMapView.userTrackingMode = MKUserTrackingModeFollow;
- //设置地图类型
- maMapView.mapType=MKMapTypeStandard;
- //添加大头针
- [self addAnnotation];
- }
- -(void)addAnnotation{
- CLLocationCoordinate2D location1=CLLocationCoordinate2DMake(destinationMode.destinationLatitude.floatValue, destinationMode.destinationLongitude.floatValue);
- QYAnnotation *annotation1=[[QYAnnotation alloc]init];
- annotation1.title= destinationMode.destinationName;
- annotation1.subtitle= destinationMode.destinationDesc;
- annotation1.coordinate=location1;
- [maMapView setCenterCoordinate:location1 zoomLevel:10 animated:NO];
- [maMapView addAnnotation:annotation1];
- [maMapView selectAnnotation:annotation1 animated:YES];
- }
- - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
- {
- }
- - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
- {
- //由于当前位置的标注也是一个大头针,所以此时需要判断,此代理方法返回nil使用默认大头针视图
- if ([annotation isKindOfClass:[QYAnnotation class]]) {
- static NSString *key1=@"QYAnnotation";
- annotationView=[mapView dequeueReusableAnnotationViewWithIdentifier:key1];
- //如果缓存池中不存在则新建
- if (!annotationView) {
- annotationView=[[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:key1];
- annotationView.canShowCallout=true;//允许交互点击
- annotationView.calloutOffset=CGPointMake(0, 1);//定义详情视图偏移量
- UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];
- [btn setBackgroundImage:[UIImage imageNamed:@"common_green_line"] forState:UIControlStateNormal];
- [btn setTitle:@"到这去" forState:UIControlStateNormal];
- [btn addTarget:self action:@selector(turnAction:) forControlEvents:UIControlEventTouchUpInside];
- annotationView.rightCalloutAccessoryView=btn;//定义详情左侧视图
- annotationView.selected = YES;
- }
- //修改大头针视图
- //重新设置此类大头针视图的大头针模型(因为有可能是从缓存池中取出来的,位置是放到缓存池时的位置)
- annotationView.annotation=annotation;
- annotationView.image=[UIImage imageNamed:@"common_map_site"];//设置大头针视图的图片
- return annotationView;
- }else {
- return nil;
- }
- }
- -(void)turnAction:(id)sender{
- [self doAppleNavigation];
- }
- -(void)doAppleNavigation{
- NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard),MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving};
- CLLocationCoordinate2D fromCoordinate = maMapView.userLocation.location.coordinate;
- CLLocationCoordinate2D toCoordinate = CLLocationCoordinate2DMake(destinationMode.destinationLatitude.floatValue, destinationMode.destinationLongitude.floatValue);
- MKPlacemark *fromPlacemark = [[MKPlacemark alloc] initWithCoordinate:fromCoordinate
- addressDictionary:nil];
- MKPlacemark *toPlacemark = [[MKPlacemark alloc] initWithCoordinate:toCoordinate
- addressDictionary:nil];
- MKMapItem *fromItem = [[MKMapItem alloc] initWithPlacemark:fromPlacemark];
- fromItem.name =@"当前位置";
- MKMapItem *toItem=[[MKMapItem alloc]initWithPlacemark:toPlacemark];
- toItem.name = destinationMode.destinationName;
- [MKMapItem openMapsWithItems:@[fromItem,toItem] launchOptions:options];
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- }
- @end
更多资料:
http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-0-0
http://blog.csdn.net/nlforever/article/details/9075313
iOS 原生地图 开发的更多相关文章
- iOS原生地图开发指南续——大头针与自定义标注
iOS原生地图开发指南续——大头针与自定义标注 出自:http://www.sxt.cn/info-6042-u-7372.html 在上一篇博客中http://my.oschina.net/u/23 ...
- iOS原生地图开发详解
在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...
- iOS原生地图开发进阶——使用导航和附近兴趣点检索
iOS原生地图开发进阶——使用导航和附近兴趣点检索 iOS中的mapKit框架对国际化的支持非常出色.在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更 ...
- IOS原生地图与高德地图
原生地图 1.什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位 ...
- iOS原生地图与高德地图的使用
原生地图 1.什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位 2. ...
- iOS 原生地图地理编码与反地理编码
当我们要在App实现功能:输入地名,编码为经纬度,实现导航功能. 那么,我需要用到原生地图中的地理编码功能,而在Core Location中主要包含了定位.地理编码(包括反编码)功能. 在文件中导入 ...
- iOS 原生地图(MapKit、MKMapView)轨迹渐变
WechatIMG2.png 项目已接入高德地图,并且大部分功能已经实现好,但BOSS觉得iOS自带的地图效果更好...本着面向老板编程的思想,换之.还好,高德地图是在MapKit上封装的,大部分ap ...
- 如何初始化一个iOS原生地图
/** 初始化一个mapView 需导入 #import <MapKit/MapKit.h> - returns: 返回一个mapView对象 */ mapView = [[MKMapV ...
- React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块
尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...
随机推荐
- Rotate Array 解答
Question Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, t ...
- java Socket使用注意
Socket s = new Socket(ia, port); BufferedOutputStream bufOut = new BufferedOutputStream(s.getOutputS ...
- java学习笔记day06---匿名内部类
1.匿名内部类:其实就是内部类的简化形式,它所体现的就是一个类或者接口的子类对象.前提: 内部类必须继承或实现外部类或接口. 格式: new 父类&接口(){}; 其实就是 ...
- [KMP][HDU3336][Count the string]
题意 计算所有S的前缀在S中出现了几次 思路 跟前缀有关的题目可以多多考虑KMP的NEXT数组 #include <cstdio> #include <cstring> #in ...
- Html5 代码
随着HTML5的流行,许多网站开始介绍HTML5元素和属性的用法,以及各种教程,并且越来越多老的浏览器开始兼容HTML5. 本文作者编译了10段非常实用的HTML5代码片段,开发者可以直接拿过去使 ...
- C#面试题总结——程序设计基础
一.类型与变量 1.C#支持哪几个预定义的值类型? 主要包括五个类型:整数,浮点数,字符型,bool类型以及decimal型(小数型).其中每一个类型分别有多个内置类型组成. 2.C#支持哪几个预定义 ...
- hadoop源码编译
为何要自行编译hadoop源码,往往是由于官方提供的hadoop发行版都是基于32位操作系统,在操作hadoop时会发生warn. 准备软件: 1)JDK 2)Hadoop源码 3)Maven 4 ...
- 为什么JavaScript函数中的参数前面不能加var
首先这里是JavaScript的语法规则. 其次在调用function()函数的时候参数时外部传入的.在传入之前就已经被声明了.没必要在函数参数里声明. 如果想要在函数里用新的参数 function( ...
- 解决在IE浏览器下 boder边框出现断裂或虚线的问题
ie6.0下面经常会出现border边框断断续续的问题,等深一步了解了div之后自然会经常碰到这种问题了,不过初学div+css 的一般不会用遇到这个问题,因为初学者不会偷懒,等我们觉得用的很熟了,各 ...
- php的多线程使用
PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. 在liunx下的安装 准备工作: 1.下载Threa ...