MKMapView和MKMapViewDelegate

  1. @interface MKMapView : UIView <NSCoding>
  2. @property (nonatomic, assign) id <MKMapViewDelegate> delegate;
  3. // Changing the map type or region can cause the map to start loading map content.
  4. // The loading delegate methods will be called as map content is loaded.
  5. /*enum {
  6. MKMapTypeStandard,
  7. MKMapTypeSatellite,
  8. MKMapTypeHybrid
  9. };*/
  10. @property (nonatomic) MKMapType mapType;
  11. // Region is the coordinate and span of the map.
  12. // Region may be modified to fit the aspect ratio(屏幕高宽比) of the view using regionThatFits:.
  13. @property (nonatomic) MKCoordinateRegion region;
  14. - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
  15. // centerCoordinate allows the coordinate of the region to be changed without changing the zoom level.
  16. /*typedef struct {
  17. CLLocationDegrees latitude;//纬度
  18. CLLocationDegrees longitude;//经度
  19. } CLLocationCoordinate2D;*/
  20. @property (nonatomic) CLLocationCoordinate2D centerCoordinate;
  21. - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
  22. // Returns a region of the aspect ratio of the map view that contains the given region, with the same center point.
  23. /*Adjusts the aspect ratio of the specified region to ensure that it fits in the map view’s frame.
  24. You can use this method to normalize the region values before displaying them in the map. This method
  25. returns a new region that both contains the specified region and fits neatly inside the map view’s frame.*/
  26. - (MKCoordinateRegion)regionThatFits:(MKCoordinateRegion)region;
  27. // Access the visible region of the map in projected coordinates.
  28. @property (nonatomic) MKMapRect visibleMapRect;
  29. - (void)setVisibleMapRect:(MKMapRect)mapRect animated:(BOOL)animate;
  30. // Returns an MKMapRect modified to fit the aspect ratio of the map.
  31. - (MKMapRect)mapRectThatFits:(MKMapRect)mapRect;
  32. // Edge padding is the minumum padding on each side around the specified MKMapRect.
  33. - (void)setVisibleMapRect:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets animated:(BOOL)animate;
  34. - (MKMapRect)mapRectThatFits:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets;
  35. - (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;
  36. - (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view;
  37. - (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view;
  38. - (MKCoordinateRegion)convertRect:(CGRect)rect toRegionFromView:(UIView *)view;
  39. // Disable user interaction from zooming or scrolling the map, or both.
  40. @property(nonatomic, getter=isZoomEnabled) BOOL zoomEnabled;
  41. @property(nonatomic, getter=isScrollEnabled) BOOL scrollEnabled;
  42. // Set to YES to add the user location annotation to the map and start updating its location
  43. @property (nonatomic) BOOL showsUserLocation;
  44. // The annotation representing the user‘s location
  45. @property (nonatomic, readonly) MKUserLocation *userLocation;
  46. /*enum {
  47. MKUserTrackingModeNone = 0, // the user‘s location is not followed
  48. MKUserTrackingModeFollow, // the map follows the user‘s location
  49. MKUserTrackingModeFollowWithHeading, // the map follows the user‘s location and heading
  50. };*/
  51. @property (nonatomic) MKUserTrackingMode userTrackingMode NS_AVAILABLE(NA, 5_0);
  52. - (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated NS_AVAILABLE(NA, 5_0);
  53. // Returns YES if the user‘s location is displayed within the currently visible map region.
  54. @property (nonatomic, readonly, getter=isUserLocationVisible) BOOL userLocationVisible;
  55. // Annotations are models used to annotate coordinates on the map.
  56. // Implement mapView:viewForAnnotation: on MKMapViewDelegate to return the annotation view for each annotation.
  57. - (void)addAnnotation:(id <MKAnnotation>)annotation;
  58. - (void)addAnnotations:(NSArray *)annotations;
  59. - (void)removeAnnotation:(id <MKAnnotation>)annotation;
  60. - (void)removeAnnotations:(NSArray *)annotations;
  61. @property (nonatomic, readonly) NSArray *annotations;
  62. - (NSSet *)annotationsInMapRect:(MKMapRect)mapRect NS_AVAILABLE(NA, 4_2);
  63. // Currently displayed view for an annotation; returns nil if the view for the annotation isn‘t being displayed.
  64. - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation;
  65. // Used by the delegate to acquire an already allocated annotation view, in lieu of allocating a new one.
  66. - (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier;
  67. // Select or deselect a given annotation.  Asks the delegate for the corresponding annotation view if necessary.
  68. - (void)selectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;
  69. - (void)deselectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;
  70. @property (nonatomic, copy) NSArray *selectedAnnotations;
  71. // annotationVisibleRect is the visible rect where the annotations views are currently displayed.
  72. // The delegate can use annotationVisibleRect when animating the adding of the annotations views in mapView:didAddAnnotationViews:
  73. @property (nonatomic, readonly) CGRect annotationVisibleRect;
  74. @end
  1. @protocol MKMapViewDelegate <NSObject>
  2. @optional
  3. - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
  4. - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
  5. - (void)mapViewWillStartLoadingMap:(MKMapView *)mapView;
  6. - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView;
  7. - (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error;
  8. // mapView:viewForAnnotation: provides the view for each annotation.
  9. // This method may be called for all or some of the added annotations.
  10. // For MapKit provided annotations (eg. MKUserLocation) return nil to use the MapKit provided annotation view.
  11. - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
  12. // mapView:didAddAnnotationViews: is called after the annotation views have been added and positioned in the map.
  13. // The delegate can implement this method to animate the adding of the annotations views.
  14. // Use the current positions of the annotation views as the destinations of the animation.
  15. - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
  16. // mapView:annotationView:calloutAccessoryControlTapped: is called when the user
  17. // taps on left & right callout accessory UIControls.
  18. - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;
  19. - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view NS_AVAILABLE(NA, 4_0);
  20. - (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view NS_AVAILABLE(NA, 4_0);
  21. //Tells the delegate that the map view will start tracking the user’s position.
  22. //This method is called when the value of the showsUserLocation property changes to YES.
  23. - (void)mapViewWillStartLocatingUser:(MKMapView *)mapView NS_AVAILABLE(NA, 4_0);
  24. //Tells the delegate that the map view stopped tracking the user’s location.
  25. //This method is called when the value of the showsUserLocation property changes to NO.
  26. - (void)mapViewDidStopLocatingUser:(MKMapView *)mapView NS_AVAILABLE(NA, 4_0);
  27. //Tells the delegate that the location of the user was updated.
  28. /*1. a new location update is received by the map view.
  29. 2. This method is also called if the map view’s user tracking mode
  30. is set to MKUserTrackingModeFollowWithHeading and the heading changes.*/
  31. - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation NS_AVAILABLE(NA, 4_0);
  32. - (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error NS_AVAILABLE(NA, 4_0);
  33. - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState
  34. fromOldState:(MKAnnotationViewDragState)oldState NS_AVAILABLE(NA, 4_0);
  35. - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(NA, 4_0);
  36. // Called after the provided overlay views have been added and positioned in the map.
  37. - (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews NS_AVAILABLE(NA, 4_0);
  38. - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated NS_AVAILABLE(NA, 5_0);
  39. @end

1. 概述

  1. 插入MapView,设置Delegate(一般为Controller),Annotations记录兴趣位置点(AnnotationView用来显示兴趣位置点),
  2. annotation是可选的,选中的annotation会显示callout,用来显示信息。

2. 设置地图显示类型:

  1. mapView.mapType = MKMapTypeStandard;
  2. mapView.mapType = MKMapTypeSatellite;
  3. mapView.mapType = MKMapTypeHybrid;

3. 显示用户位置

  1. 设置为可以显示用户位置:
  2. mapView.showsUserLocation = YES;
  3. 判断用户当前位置是否可见(只读属性):
  4. userLocationVisible
  5. 得到用户位置坐标:当userLocationVisible为YES时
  6. CLLocationCoordinate2D coords = mapView.userLocation.location.coordinate;

4.坐标范围

  1. MKCoordinateRegion用来设置坐标显示范围。包括两部分:
  2. a. Center(CLLocationCoordinate2D struct,包括latitude和longitude),坐标中心
  3. b. Span(MKCoordinateSpan struct,包括latitudeDelta和longitudeDelta),缩放级别
  4. //创建一个以center为中心,上下各1000米,左右各1000米得区域,但其是一个矩形,不符合MapView的横纵比例
  5. MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(center,2000, 2000);
  6. //以上代码创建出来一个符合MapView横纵比例的区域
  7. MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion];
  8. //以上代码为:最终显示该区域
  9. [mapView setRegion:adjustedRegion animated:YES];

5. delegate

  1. 使用MapView须符合MKMapViewDelegate协议
  2. 5.1、地图加载Delegate
  3. 当需要从Google服务器取得新地图时
  4. mapViewWillStartLoadingMap:
  5. 当成功地取得地图后
  6. mapViewDidFinishLoadingMap:
  7. 当取得地图失败后(建议至少要实现此方法)
  8. mapViewDidFailLoadingMap:withError:
  9. 5.2、范围变化Delegate
  10. 当手势开始(拖拽,放大,缩小,双击)
  11. mapView:regionWillChangeAnimated:
  12. 当手势结束(拖拽,放大,缩小,双击)
  13. mapView:regionDidChangeAnimated:
  14. 判断坐标是否在MapView显示范围内:
  15. CLLocationDegrees leftDegrees = mapView.region.center.longitude –(mapView.region.span.longitudeDelta / 2.0);
  16. CLLocationDegrees rightDegrees = mapView.region.center.longitude +(mapView.region.span.longitudeDelta / 2.0);
  17. CLLocationDegrees bottomDegrees = mapView.region.center.latitude –(mapView.region.span.latitudeDelta / 2.0);
  18. CLLocationDegrees topDegrees = self.region.center.latitude +(mapView.region.span.latitudeDelta / 2.0);
  19. if (leftDegrees > rightDegrees)
  20. { // Int‘l Date Line in View
  21. leftDegrees = -180.0 - leftDegrees;
  22. if (coords.longitude > 0) // coords to West of Date Line
  23. coords.longitude = -180.0 - coords.longitude;
  24. }
  25. if (leftDegrees <= coords.longitude
  26. && coords.longitude <= rightDegrees
  27. && bottomDegrees <= coords.latitude
  28. && coords.latitude <= topDegrees)
  29. {
  30. // 坐标在范围内
  31. }

6.Annotation

  1. Annotation包含两部分:Annotation Object和Annotation View
  2. Annotation Object必须符合协议MKAnnotation,包括两个方法:title和subtitle,分别用于显示注释的标题和子标题。还有coordinate属性,返回CLLocationCoordinate2D,表示Annotation的位置
  3. 然后,需使用mapView:viewForAnnotation: 方法来返回MKAnnotationView或者MKAnnotationView的子类用来显示Annotation(注意:这里显示的不是选中Annotation后的弹出框)
  4. 你可以子类化MKAnnotationView,然后再drawRect:方法里面进行自己的绘制动作(这个方法很蠢)
  5. 你完全可以实例化一个MKAnnotationView,然后更改它的image属性,这样很简单。

7.添加移除Annotation

  1. 添加一个Annotation
  2. [mapView addAnnotation:annotation];
  3. 添加一个Annotation数组
  4. [mapView addAnnotations:[NSArray arrayWithObjects:annotation1, annotation2, nil]];
  5. 移除一个Annotation
  6. removeAnnotation:
  7. 移除一个Annotation数组
  8. removeAnnotations:
  9. 移除所有Annotation
  10. [mapView removeAnnotations:mapView.annotations];

8. 选中Annotation

  1. 一次只能有一个Annotation被选中,选中后会出现CallOut(浮动框)
  2. 简单的CallOut显示Title和SubTitle,但你也可以自定义一个UIView作为CallOut(与自定义的TableViewCell一样)
  3. 可通过代码选中Annotation:
  4. selectAnnotation:animated:
  5. 或者取消选择:
  6. deselectAnnotation:animated:

9. 显示Annotation

  1. 通过mapView:viewForAnnotation: 方法显示Annotation,每在MapView中加入一个Annotation,就会调用此方法
  2. 示例(与tableView:cellForRowAtIndexPath: 很相似)
  3. - (MKAnnotationView *) mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>) annotation
  4. {
  5. static NSString *placemarkIdentifier = @"my annotation identifier";
  6. if ([annotation isKindOfClass:[MyAnnotation class]])
  7. {
  8. MKAnnotationView *annotationView = [theMapView dequeueReusableAnnotationViewWithIdentifier:placemarkIdentifier];
  9. if (annotationView == nil)
  10. {
  11. annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placemarkIdentifier];
  12. annotationView.image = [UIImage imageNamed:@"blood_orange.png"];
  13. }
  14. else
  15. annotationView.annotation = annotation;
  16. return annotationView;
  17. }
  18. return nil;
  19. }

10. 取得真实地址

    1. 示例:
    2. 初始化MKReverseGeocoder
    3. MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:coordinates];
    4. geocoder.delegate = self;
    5. [geocoder start];
    6. 如果无法处理坐标,则调用reverseGeocoder:didFailWithError: 方法
    7. - (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
    8. {
    9. NSLog(@"Error resolving coordinates: %@", [error localizedDescription]);
    10. geocoder.delegate = nil;
    11. [geocoder autorelease];
    12. }
    13. 如果成功,则调用reverseGeocoder:didFindPlacemark: 并把信息存储在MKPlacemark 中
    14. didFindPlacemark:(MKPlacemark *)placemark
    15. {
    16. NSString *streetAddress = placemark.thoroughfare;
    17. NSString *city = placemark.locality;
    18. NSString *state = placemark.administrativeArea;
    19. NSString *zip = placemark.postalCode;
    20. // Do something with information
    21. geocoder.delegate = nil;
    22. [geocoder autorelease];
    23. }
时间: 2024-10-05 12:57:24

MKMapView和MKMapViewDelegate的相关文章

2015最新iOS学习线路图

iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置的众多技术和功能让 Apple设备始终保持着遥遥领先的地位. iOS学习路线:http://www.mobiletrain.org/page/ios.html 课程分  类 课程模块 模块介绍 课程内容 Part1C语言 C语言和Objective-C语言 C语言 Mac系统及常用工具.进制:C数据

iOS 开发之定位与苹果地图

1.LBS开发 需求: 社交类应用 ,  购物类 ,  旅游类... 功能: 定位.地图 官方提供:定位与地图(国内使用的高德的数据) 第三方:高德,百度,搜搜,腾讯,谷歌地图... 2.地理定位 2.1 库的配置 /*****地图定位*****/ //LBS --> Location Based Service //1.配置库 --> CoreLocation.framework (系统的) // --> #import <CoreLocation/CoreLocation.h&

第十章:使用MapKit开发地图服务

一.使用MapKit框架 MapKit.framework使用MKMapView类代表地图控件,开发者只要在应用界面上添加并显示控件,该应用就可以增加地图. MapKitView类的常用属性如下: (1). @property (nonatomic) MKMapType mapType;用于设置和返回地图的类型.该属性支持如下 typedef NS_ENUM(NSUInteger, MKMapType) { MKMapTypeStandard = 0,(标准地图) MKMapTypeSatell

简易地图(MKMapView,CLLocationManagerDelegate,CLGeocoder)

概要 本章主要简示了IOS里面位置服务的使用,包括定位,地图,地图标记以及地图定位.由于现在的地图开发和以前的差别比较大,而且地图涉及的东西相对而言复杂点,所以本实验耗时比较多,有的地方还存在一些问题. 结果展示 注意文本框的两个数字是当前的经纬度,地图视图切换是切换到该经纬度的位置,最后红色的那个标注即为地图中的经纬度,不过由于经纬度解析部分有问题,所以未能显示经纬度的对应地址是什么.(示例里面不是使用代理来解析经纬度的,使用的是CLGeocoder,因为以前使用的代理官方建议不再使用了.)

iOS MKMapView嵌入地图

要看到那个google的地图,在实现上也相当简便.嵌入地图时需要MKMapView这个类, 它有很多方法和属性,不过如果只是想得到基本的定位功能的话,只需实例化一个对像然后加到当前的 view上就可以了. <一>先介绍一下,它的几个常用的属性. region 用来设置地图的那一部份被显示,它是一个结构体,定义如下: typedef struct{ CLLocationCoordinate2D center;//表示显示的中心 MKCoordinateSpan span; //表示比例 }MKC

iOS开发--MKMapView截图

地图控件MKMapView由于要从网络上加载地图数据并在内存中缓存,因此通常占用的内存开销特别大,特别是当用户进行放大缩小.快速拖动.3d旋转时,内存基本呈直线上升,单个地图控件占用百兆内存不成问题. 假设在一个UITableView中,每个Cell的宽度和高度分别为320.150,每个Cell中都放置一个高度为320*150的MkMapView,采用Cell重用的方式,这种情况下iPhone 4s上UITableView中将最多包含4个MkMapView.又假设这里的MkMapView仅仅用于

【iOS开发-110】MapKit框架的主要类MKMapView以及代理方法,大头针的使用addAnnotation

#import "ViewController.h" #import <MapKit/MapKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController ()<MKMapViewDelegate> @property(nonatomic,strong) CLLocationManager *locMgr; @property (weak, nonatomic) IBOut

MKMapView

MKMapView的基本应用和定位实现介绍: MKMapView是iOS平台提供的地图API 使用方法: 首先导入MapKit.framework框架并包含头文件 创建地图视图: ? 1 2 MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:mapView]; 设置地图类型: ? 1 mapView.mapType = MKMapTypeHybrid/Sat

iOS开发--MKMapView添加UIPanGestureRecognizer

当我们想给MKMapView添加拖动手势时,第一个想法可能是这样: - (void)viewDidLoad { //.... UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self.mapView addGestureRecognizer:panGesture]; } - (void)handlePan