【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等

转自:http://blog.csdn.net/dolacmeng/article/details/46594839

以前做项目用高德地图SDK,需要注册账号和AppID,然后下载SDK集成到项目中,比较麻烦,这几天看了下苹果自带的MapKit框架,感觉挺好用,官方文档也介绍得很详细,所以按照官方文档写了个demo,实现地图的显示、显示用户当前位置、放置大头针、弹出气泡等基本功能。希望能帮到刚接触MapKit的朋友~

1.显示地图

(1)首先我们要像下图这样子打开地图功能:

XCode会自动给我们的项目进行配置,例如会自动给我们添加MapKit.frameworks。

(2)在需要使用地图的类中

#import <MapKit/MapKit.h>

(3)显示地图有两种方法:

<1>使用Interface Builder, 拖一个Map view对象到View中

<2>使用纯代码,创建一个MKMapView的实例,使用initWithFrame:来进行初始化,最后将它作为subview添加到windows或者其它UIView上。

因为一个map view是一个UIView子类,所以可以像操作其它View那样操作map view,因此可以给map view添加任何subview,但是添加的subview并不会随着地图内容的移动而移动,如果需要跟随移动,必须使用annotations 或者 overlays。

新建的地图,默认只是显示地图数据以及响应用户手势。通过创建MKMapCamera实例,可以进行3D地图显示,通过设置mapType属性可以设置地图来显示卫星地图、卫星地图和地图数据的混合视图,通过改变属性rotateEnabled, pitchEnabled, zoomEnabled,scrollEnabled 等,可以限制用户的控制权限。通过实现代理MKMapViewDelegate ,可以响应用户的手势操作。

以下为使用第<2>种方法来显示地图:

[objc] view plain copy

  1. mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
  2. [self.view addSubview:mapView];

运行效果如下:

2.设置地图的默认显示区域

步骤1中添加的地图,默认会显示整个地球的视图,可以通过修改它的Region属性来设置地图初始化时默认的显示区域,这个属性是一个MKCoordinateRegion结构体,定义如下:

[objc] view plain copy

  1. typedef struct {
  2. CLLocationCoordinate2D center;
  3. MKCoordinateSpan span;
  4. } MKCoordinateRegion;

其中span是使用度、分、秒为单位的,一度约等于111km,但是我们一般习惯使用的是长*宽的数据,因此可以使用MKCoordinateRegionMakeWithDistance 方法将常用的长和宽数据转化为需要的以度为单位的数据。下面就是将地图的显示范围设置为中心点为经纬度(29.454686,106.529259),南北方向和东西方向均为5km的区域

[objc] view plain copy

  1. [mapView setRegion:MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(29.454686, 106.529259), 5000, 5000) animated:YES];

添加上面一句代码后,步骤1中的视图变成了下图的效果:

3.显示3D地图

3D地图是从某个海拔高度点以一定角度俯瞰2D地图的视图,在iOS7和OSX10.9及以后版本,可以使用MKMapCamera类来调整3D地图。

一个MKMapCamera实例类camera,使用下面的属性来确定3D地图:

? 海拔高度(Altitude). camera的距离2D地图平面的高度,单位米

? 斜度(Pitch).camera相对于地面倾斜的角度(其中0度表示垂直往下看,所以效果是标准的2D地图)

? 方向(Heading). camera面对的方向

? 中心(Center). 显示在屏幕正中间的地图表面的点

或许举一个例子就秒懂了,下面的代码就是实现从经纬度(29.545686,106.628259),高度为100的空中俯瞰经纬度(29.454686,106.529259)的效果:

[objc] view plain copy

  1. // Create a coordinate structure for the location.
  2. CLLocationCoordinate2D ground = CLLocationCoordinate2DMake(29.454686, 106.529259);
  3. // Create a coordinate structure for the point on the ground from which to view the location.
  4. CLLocationCoordinate2D eye = CLLocationCoordinate2DMake(29.545686, 106.628259);
  5. // Ask Map Kit for a camera that looks at the location from an altitude of 100 meters above the eye coordinates.
  6. MKMapCamera *myCamera = [MKMapCamera cameraLookingAtCenterCoordinate:ground fromEyeCoordinate:eye eyeAltitude:100];
  7. // Assign the camera to your map view
  8. mapView.camera = myCamera;

4.滑动和缩放地图内容

通过滑动和缩放可以随时改变地图的显示区域

? 通过滑动地图,改变map view或者camera的centerCoordinate 值,或者直接调用map view的setCenterCoordinate:animated:或者setCamera:animated: 方法

? 改变放大级别,改变map view的region属性的值,或者调用setRegion:animated:方法,你也可以在3D地图中改变camera的海拔高度的值(设置海拔高度为双倍或者一半,大约等于放大或缩小一个级别)。

例如,下面的代码将地图往左移动当前地图宽度的一半的距离,并且带有移动的动画效果。

[objc] view plain copy

  1. CLLocationCoordinate2D mapCenter = mapView.centerCoordinate;
  2. mapCenter = [mapView convertPoint:
  3. CGPointMake(1, (mapView.frame.size.width/2.0))
  4. toCoordinateFromView:mapView];
  5. [mapView setCenterCoordinate:mapCenter animated:YES];

通过修改地图的region属性的span的值进行地图缩放。如果要放大(拉近镜头),将span设置为一个更小的值,如果要缩小(拉远镜头),将span设置为一个更大的值。以下为缩小的示例代码:

[objc] view plain copy

  1. MKCoordinateRegion theRegion = myMapView.region;
  2. // Zoom out
  3. theRegion.span.longitudeDelta *= 2.0;
  4. theRegion.span.latitudeDelta *= 2.0;
  5. [myMapView setRegion:theRegion animated:YES];

5.在地图上显示用户当前位置

要在地图上显示用户位置,先设置map view的showsUserLocation属性为Yes

[objc] view plain copy

  1. mapView.showsUserLocation = YES;

以上代码只是告诉mapView要显示用户位置,但mapView并不知道用户的位置,因此还需要通过CLLocationManager来使用定位服务:创建一个CLLocationManager 的实例,设置它的desiredAccuracy(期望的定位精度)和distanceFilter(距离过滤)属性。为了接收到位置更新的通知,设置代理CLLocationManagerDelegate,并调用startUpdatingLocation方法来注册接收定位更新(调用stopUpdatingLocation取消接收定位更新)。另外在iOS8中,需要向用户请求定位权限,示例代码如下:

[objc] view plain copy

  1. - (void)startStandardUpdates{
  2. // Create the location manager if this object does not
  3. // already have one.
  4. if (nil == locationManager)
  5. locationManager = [[CLLocationManager alloc] init];
  6. locationManager.delegate = self;
  7. locationManager.desiredAccuracy = kCLLocationAccuracyBest;
  8. if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
  9. [locationManager requestWhenInUseAuthorization];
  10. }
  11. if(![CLLocationManager locationServicesEnabled]){
  12. NSLog(@"请开启定位:设置 > 隐私 > 位置 > 定位服务");
  13. }
  14. if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
  15. [locationManager requestAlwaysAuthorization]; // 永久授权
  16. [locationManager requestWhenInUseAuthorization]; //使用中授权
  17. }
  18. [locationManager startUpdatingLocation];
  19. }

效果如图:

关于iOS定位的详细讲解(后台持续定位),请看我的另一篇博文:http://blog.csdn.net/dolacmeng/article/details/45064939

6.创建一个地图快照

有时候,我们的需求并不需要一个功能完整的map view视图。例如,如果app只是想用户在一个地图图像的滚动列表中选择,那就不需要实现地图的交互功能。另一个创建一个静态地图图像的原因是为了实现绘图功能。在上面提到的需求中,我们可以使用MKMapSnapshotter对象来异步地创建一个静态的地图图像。

一般的,通过下面的步骤来创建一个地图快照

1.确保网络连接正常并且app正在前台运行

2.创建一个MKMapSnapshotOptions对象,并设置地图外观、输出大小等

3.创建一个MKMapSnapshotter对象并用上一步的实例对象初始化进行初始化。

4.调用startWithCompletionHandler:方法来开始异步的快照任务

5.当任务完成,从block中取回地图快照,并添加需要的覆盖物或者标注。

示例代码:

[objc] view plain copy

  1. -(void)shot{
  2. MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
  3. options.region = mapView.region;
  4. options.size = mapView.frame.size;
  5. options.scale = [[UIScreen mainScreen] scale];
  6. MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
  7. // Initialize the semaphore to 0 because there are no resources yet.
  8. dispatch_semaphore_t snapshotSem = dispatch_semaphore_create(0);
  9. // Get a global queue (it doesn‘t matter which one).
  10. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  11. // Create variables to hold return values. Use the __block modifier because these variables will be modified inside a block.
  12. __block MKMapSnapshot *mapSnapshot = nil;
  13. __block NSError *error = nil;
  14. // Start the asynchronous snapshot-creation task.
  15. [snapshotter startWithQueue:queue
  16. completionHandler:^(MKMapSnapshot *snapshot, NSError *e) {
  17. mapSnapshot = snapshot;
  18. error = e;
  19. // The dispatch_semaphore_signal function tells the semaphore that the async task is finished, which unblocks the main thread.
  20. dispatch_semaphore_signal(snapshotSem);
  21. }];
  22. // On the main thread, use dispatch_semaphore_wait to wait for the snapshot task to complete.
  23. dispatch_semaphore_wait(snapshotSem, DISPATCH_TIME_FOREVER);
  24. if (error) { // Handle error. }
  25. // Get the image from the newly created snapshot.
  26. //UIImage *image = mapSnapshot.image;
  27. // Optionally, draw annotations on the image before displaying it.
  28. }
  29. UIImage *image = mapSnapshot.image;
  30. UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
  31. imageView.image = image;
  32. [self.view addSubview:imageView];
  33. }

效果如下:

7.添加大头针(下文中统一称作标注)

(1)为了在地图上添加标注,app必须提供两个明确的对象

?一个annotation 对象, 遵从MKAnnotation代理,管理标注的数据(只是存储标注的数据,不涉及视图)

?一个annotation view, 用来在地图上画annotation的表现形式(用来显示标注数据的视图)

(2)明确了(1)中的要求后,得到添加标注的步骤:

<1>使用下面任何一个对象(annotation 对象)来确定一个合适的标注

?使用MKPointAnnotation类来实现一个标注,这种类型的标注包含显示在标注弹出气泡标题和副标题的属性。

?定义一个自定义的遵从MKAnnotation代理的对象,自定义的标注可以包含任何我们想存贮的数据类型。详细看Defining a Custom Annotation Object

<2>定义一个 annotation view来在屏幕上显示标注的数据。怎么定义annotation view 取决于我们的需求,可以是下面的任何一个:

?如果是要使用标准的大头针标注,创建一个MKPinAnnotationView类的实例。

?如果标注用自定义的静态图片来展示,创建一个MKAnnotationView类的实例,设置它的image属性为展示的图片。

?如果一张静态图片不足够来展现标注,新建一个MKAnnotationView的子类,实现自定义的绘制方法。

<3>实现mapView:viewForAnnotation:代理方法。

这个方法返回一个MKAnnotationView类型的视图,来显示标注的信息, 如果不实现这个代理方法或者return nil,就会用默认的 annotation view进行数据显示(也就是显示红色大头针、title、subtitle,效果请看下面的例子1)。

<4>使用addAnnotation: (或者 addAnnotations:)方法来添加标注到地图。

上面都是直接从官方文档翻译的,感觉有点晦涩难懂,还是上例子吧,比较比较容易理解~

(例子1)使用MKPointAnnotation类来作为标注,并使用默认的annotation view(不用实现mapView:viewForAnnotation:方法,或者return nil),代码及效果如下:

[objc] view plain copy

  1. MKPointAnnotation *annotation0 = [[MKPointAnnotation alloc] init];
  2. [annotation0 setCoordinate:CLLocationCoordinate2DMake(29.454686, 106.529259)];
  3. [annotation0 setTitle:@"重庆理工大学"];
  4. [annotation0 setSubtitle:@"重庆市巴南区红光大道69号"];
  5. [mapView addAnnotation:annotation0];

例子2)使用MKPointAnnotation类来作为标注(还是用例子1中的代码),并使用默认的自定义MKPinAnnotationView,将大头针设置为紫色,设置气泡左边的图像,并在右边添加一个按钮(实现View:viewForAnnotation:方法,并返回一个MKPinAnnotationView实例),在例子1中增加代码及效果如下:

[objc] view plain copy

  1. - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
  2. // If the annotation is the user location, just return nil.(如果是显示用户位置的Annotation,则使用默认的蓝色圆点)
  3. if ([annotation isKindOfClass:[MKUserLocation class]])
  4. return nil;
  5. if ([annotation isKindOfClass:[MKPointAnnotation class]]) {
  6. // Try to dequeue an existing pin view first.(这里跟UITableView的重用差不多)
  7. MKPinAnnotationView *customPinView = (MKPinAnnotationView*)[mapView
  8. dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
  9. if (!customPinView){
  10. // If an existing pin view was not available, create one.
  11. customPinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
  12. reuseIdentifier:@"CustomPinAnnotationView"];
  13. }
  14. //iOS9中用pinTintColor代替了pinColor
  15. customPinView.pinColor = MKPinAnnotationColorPurple;
  16. customPinView.animatesDrop = YES;
  17. customPinView.canShowCallout = YES;
  18. UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, 50)];
  19. rightButton.backgroundColor = [UIColor grayColor];
  20. [rightButton setTitle:@"查看详情" forState:UIControlStateNormal];
  21. customPinView.rightCalloutAccessoryView = rightButton;
  22. // Add a custom image to the left side of the callout.(设置弹出起泡的左面图片)
  23. UIImageView *myCustomImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myimage"]];
  24. customPinView.leftCalloutAccessoryView = myCustomImage;
  25. return customPinView;
  26. }
  27. return nil;//返回nil代表使用默认样式
  28. }

为了响应“查看详情”的点击事件,只要实现以下代理方法:

[objc] view plain copy

  1. -(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{
  2. NSLog(@"点击了查看详情");
  3. }

例子3)使用MKPointAnnotation类来作为标注(还是用例子1中的代码),并使用默认的自定义MKAnnotationView
,将大头针设置为自定义图像,(实现View:viewForAnnotation:方法,并返回一个MKAnnotationView实例),例1中新增代码及效果如下:

[objc] view plain copy

  1. - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
  2. {
  3. // If the annotation is the user location, just return nil.
  4. if ([annotation isKindOfClass:[MKUserLocation class]])
  5. return nil;
  6. if ([annotation isKindOfClass:[MKPointAnnotation class]]) {
  7. MKAnnotationView* aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"MKPointAnnotation"];
  8. aView.image = [UIImage imageNamed:@"myimage"];
  9. aView.canShowCallout = YES;
  10. return aView;
  11. }
  12. return nil;
  13. }

例子4)这个例子较前面的例子要复杂些:

1. 使用实现MKAnnotation代理的自定义对象(MyCustomAnnotation)来作为标注(能存储任意的数据,例如存储一家餐厅的名字、地址、好评率、距离等属性,上面三个例子中的MKPointAnnotation只能存储title和subtitle,这里的例子定义了两个属性:maintitle和subtitle)。

2.使用继承自MKAnnotationView的类(MyCustomAnnotationView)来自定义气泡视图(实现View:viewForAnnotation:方法,并返回一个继承自MKAnnotationView的实例,其中,MKAnnotationView包含一个UIViewController的属性,这个view controller用来管理气泡的视图和响应事件,并且这个例子使用xib来设计界面)。

3.在MyCustomAnnotationView中要实现hitTest:和setSelected:animated:方法,来显示或隐藏气泡。

代码及效果如下:

MyCustomAnnotation.h文件

[objc] view plain copy

  1. #import <Foundation/Foundation.h>
  2. #import <MapKit/MapKit.h>
  3. @interface MyCustomAnnotation : NSObject <MKAnnotation> {
  4. CLLocationCoordinate2D coordinate;
  5. }
  6. @property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
  7. @property (nonatomic, strong) NSString *maintitle;
  8. @property (nonatomic, strong) NSString *secondtitle;
  9. - (id)initWithLocation:(CLLocationCoordinate2D)coord;
  10. @end

MyCustomAnnotation.m文件

[objc] view plain copy

  1. #import "MyCustomAnnotation.h"
  2. @implementation MyCustomAnnotation
  3. @synthesize coordinate;
  4. - (id)initWithLocation:(CLLocationCoordinate2D)coord {
  5. self = [super init];
  6. if (self) {
  7. coordinate = coord;
  8. }
  9. return self;
  10. }
  11. @end

MyCustomAnnotationView.h

[objc] view plain copy

  1. #import <MapKit/MapKit.h>
  2. #import "CustomCalloutViewController.h"
  3. @class MyCustomAnnotation;
  4. @interface MyCustomAnnotationView : MKPinAnnotationView
  5. - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier;
  6. @property(strong,nonatomic)CustomCalloutViewController *calloutViewController;
  7. @property(strong,nonatomic)MyCustomAnnotation *myCustomAnnotation;
  8. @end

MyCustomAnnotationView.m

[objc] view plain copy

  1. #import "MyCustomAnnotationView.h"
  2. #import "MyCustomAnnotation.h"
  3. @implementation MyCustomAnnotationView
  4. - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
  5. {
  6. self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
  7. if (self)
  8. {
  9. // Set the frame size to the appropriate values.
  10. CGRect  myFrame = self.frame;
  11. myFrame.size.width = 20;
  12. myFrame.size.height = 20;
  13. self.frame = myFrame;
  14. // The opaque property is YES by default. Setting it to
  15. // NO allows map content to show through any unrendered parts of your view.
  16. self.opaque = NO;
  17. self.canShowCallout = NO;
  18. self.calloutViewController = [[CustomCalloutViewController alloc] initWithNibName:@"CustomCalloutView" bundle:nil];
  19. self.myCustomAnnotation = (MyCustomAnnotation *)annotation;
  20. }
  21. return self;
  22. }
  23. - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
  24. {
  25. UIView *hitView = [super hitTest:point withEvent:event];
  26. if (hitView == nil && self.selected) {
  27. CGPoint pointInAnnotationView = [self.superview convertPoint:point toView:self];
  28. UIView *calloutView = self.calloutViewController.view;
  29. hitView = [calloutView hitTest:pointInAnnotationView withEvent:event];
  30. }
  31. return hitView;
  32. }
  33. - (void)setSelected:(BOOL)selected animated:(BOOL)animated
  34. {
  35. [super setSelected:selected animated:YES];
  36. // Get the custom callout view.
  37. UIView *calloutView = self.calloutViewController.view;
  38. if (selected) {
  39. self.calloutViewController.maintitle.text = self.myCustomAnnotation.maintitle;
  40. self.calloutViewController.secondtitle.text = self.myCustomAnnotation.secondtitle;
  41. CGRect annotationViewBounds = self.bounds;
  42. CGRect calloutViewFrame = calloutView.frame;
  43. if (calloutViewFrame.origin.x==annotationViewBounds.origin.x) {
  44. // Center the callout view above and to the right of the annotation view.
  45. calloutViewFrame.origin.x  -= (calloutViewFrame.size.width - annotationViewBounds.size.width) * 0.5;
  46. calloutViewFrame.origin.y -= (calloutViewFrame.size.height);
  47. calloutView.frame = calloutViewFrame;
  48. }
  49. [self addSubview:calloutView];
  50. } else {
  51. [calloutView removeFromSuperview];
  52. }
  53. }
  54. @end

CustomCalloutViewController.h文件

[objc] view plain copy

  1. @interface CustomCalloutViewController : UIViewController{
  2. UILabel *labTitle;
  3. }
  4. @property (weak, nonatomic) IBOutlet UILabel *maintitle;
  5. @property (weak, nonatomic) IBOutlet UILabel *secondtitle;
  6. @end

CustomCalloutViewController.m文件

[objc] view plain copy

  1. @implementation CustomCalloutViewController
  2. - (void)viewDidLoad {
  3. [super viewDidLoad];
  4. }
  5. - (void)didReceiveMemoryWarning {
  6. [super didReceiveMemoryWarning];
  7. }
  8. @end

View:viewForAnnotation:代理方法:

[objc] view plain copy

  1. - (MKAnnotationView *)mapView:(MKMapView *)mapView
  2. viewForAnnotation:(id <MKAnnotation>)annotation
  3. {
  4. <span style="white-space:pre">    </span>MyCustomAnnotationView *annotationView = (MyCustomAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"MyCustomAnnotationView"];
  5. if (!annotationView) {
  6. annotationView = [[MyCustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"MyCustomAnnotationView"];
  7. annotationView.image = [UIImage imageNamed:@"myimage"];
  8. }
  9. return annotationView;
  10. }

另外,还能实现导航等功能,有时间再继续写。

2015-11-22修改:

很久没登录博客了,现在上传Demo代码:http://download.csdn.net/detail/dolacmeng/9290823

时间: 2024-10-27 04:38:00

【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等的相关文章

iOS开发系列--地图与定位

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

转-iOS开发系列--地图与定位

来自: http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-4-0 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用

iOS开发系列--地图与定位-ios8

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

iOS原生地图开发指南续——大头针与自定义标注

iOS原生地图开发指南续——大头针与自定义标注 出自:http://www.sxt.cn/info-6042-u-7372.html 在上一篇博客中http://my.oschina.net/u/2340880/blog/415360系统总结了iOS原生地图框架MapKit中主体地图的设置与应用.这篇是上一篇的一个后续,总结了系统的大头针视图以及自定义标注视图的方法. 一.先来认识一个协议MKAnnotation 官方文档告诉我们,所有标注的类必须遵守这个协议.所以可以了解,标注这个概念在逻辑属

iOS MapKit导航及地理转码辅助类

Problem 2167 大王叫我来巡山呐 做的的第二题 呵呵 Problem 2168 防守阵地 I 做的第一题 打了下草稿 马上切了它 假设当前x=(ai)*1+(ai+1)*2+(ai+2)*3+''''+(aj)*m 下一次是(ai+1)*1+(ai+2)*2+(ai+3)*3+''''+(aj+1)*m = (ai)*1+(ai+1)*2+(ai+2)*3+''''+(aj)*m+(aj+1)*(m+1) -(ai+(ai+1)+(ai+2)+'''+(aj)+(aj+1)) 紫色的这

IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息

IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{ BMKCoordinateRegion region; region.center.latitude  = userLocation.location.coordinate.latitude; region.center.longitude = userLoca

iOS开发之地图-----01定位CoreLocation

1.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 导航:去任意陌生的地方 周边:找餐馆.找酒店.找银行.找电影院 2.在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发 Map Kit :用于地图展示 Core Location :用于地理定位 3.2个热门专业术语 LBS :Location Based Service SoLoMo :Social Local Mobile(索罗门) 2.经纬度 1.经纬度的各种定义 本初

iOS 高德地图API不能定位及INVALID_USER_SCODE

iOS 高德地图API不能定位及INVALID_USER_SCODE问题,有需要的朋友可以参考下. 一.在使用高德地图的API的时候,没有办法实现定位,在这里说一下在真机测试的时候出现没法定位应该注意的几点问题和解决方法. 1.将mapView添加到self.view上,[self.view addSubView:self.mapView]; 2.在plist文件中添加一个属性NSLocationAlwaysUsageDescription. 3.设置mapView的一个属性,self.mapV

iOS进阶_地图上定位的标志——大头针

一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大头针类,我自定义的为MyAnnotation 大头针: 在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的“大头针”.只要一个NSObject类实现MKAnnotation协议就可以作为一个大头针,通常会重写协议中coordinate(标记位置).title(标题).subtitl

iOS开发——高级篇——地理定位 CoreLocation

一.CoreLocation 在移动互联网时代,移动app能解决用户的很多生活琐事,比如周边:找餐馆.找KTV.找电影院等等导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达 在上述应用中,都用到了定位和地图功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发CoreLocation :用于地理定位,地理编码,区域监听等(着重功能实现)MapKit :用于地图展示,例如大头针,路线.覆盖层展示等(着重界面展示) 2个热门专业术语LBS :Location Based