zoukankan      html  css  js  c++  java
  • iOS开发那些事-iOS6苹果地图有用开发

    在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,可是API编程接口没有太大的变化。开发者不须要再学习非常多新东西就能开发地图应用,这是负责任的做法。因此本节介绍的内容也相同适用于iOS5上执行地图应用开发。

    iOS应用程序中使用Map Kit API开发地图应用程序。 其核心是MKMapView类使用。我们能够设置地图显示方式、控制地图,能够在地图上加入标注。

    显示地图

    在Map Kit API中显示地图的视图是MKMapView,它的托付协议是MKMapViewDelegate。Map Kit API使用须要导入MapKit框架。

    以下我们通过一个案例介绍一以下我们介绍一下Map Kit API的使用。这个案例在“输入查询地点keyword”文本框中输入keyword,点击“查询”button,先进行地理信息编码查询,查询获得地标信息后,在地图上标注出来。

    1

    首先加入框架MapKit.framework。然后在project中打开MainStoryboard.storyboard的IB设计,从对象库中拖拽Map View到设计画面中。

    2

    调整它的位置和大小使得Map View尽可能填出画面以下的空白部分,然后为Map View定义输入出口。以下我们看看主视图控制器ViewController.h代码:

    #import <UIKit/UIKit.h>
    
    #import <MapKit/MapKit.h>
    
    #import ”MapLocation.h”
    
     
    
    @interface ViewController : UIViewController <MKMapViewDelegate>
    
     
    
    @property (weak, nonatomic) IBOutlet UITextField *txtQueryKey;
    
     
    
    @property (weak, nonatomic) IBOutlet MKMapView *mapView;
    
     
    
    - (IBAction)geocodeQuery:(id)sender;
    
     
    
    @end


    因为使用Map Kit API,须要引入头文件<MapKit/MapKit.h>,头文件”MapLocation.h”是我们自定义的描写叙述地图标注点类。在定义ViewController时,还须要声明实现MKMapViewDelegate协议。txtQueryKey属性是查询keyword文本框,mapView属性是MKMapView类型,它与画面相应。点击查询button触发geocodeQuery:方法,它处理查询并在地图上做标注。

    以下我看看ViewController.m的viewDidLoad方法代码:

    - (void)viewDidLoad
    
    {
    
    [super viewDidLoad];
    
    _mapView.mapType = MKMapTypeStandard;
    
    _mapView.delegate = self;
    
    }


    在viewDidLoad方法中设置地图的类型,它的类型有3种:

    MKMapTypeStandard 标注地图类型。

    MKMapTypeSatellite 卫星地图类型。在卫星地图中没有街道名称等信息;

    MKMapTypeHybrid 混合地图类型。在混合地图是在卫星地图上标注出街道等信息;

    3 4 5

    viewDidLoad方法的_mapView.delegate = self语句是当前视图控制器赋值给地图视图的delegate属性,这样地图视图在须要的时候就会回调ViewController,假设失败,回调以下的失败方法:

    - (void)mapViewDidFailLoadingMap:(MKMapView *)theMapView withError:(NSError *)error {
    
    NSLog(@”error : %@”,[error description]);
    
    }


    跟踪用户位置变化

    MapKit提供了跟踪用户位置和方向变化的API,我们不用自己编写定位服务代码。开启地图视图的showsUserLocation属性,并设置方法setUserTrackingMode:就能够了,代码例如以下:

    - (void)viewDidLoad
    
    {
    
    [super viewDidLoad];
    
    if ([CLLocationManager locationServicesEnabled])
    
    {
    
    _mapView.mapType = MKMapTypeStandard;
    
    _mapView.delegate = self;
    
    _mapView.showsUserLocation = YES;
    
    [_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
    
    }
    
    }


    当中代码_mapView.showsUserLocation = YES,同意跟踪显示用户位置信息。在iOS设备中显示用户位置方式是一个发亮的蓝色小圆点。

    7

    [_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]语句设置用户跟踪模式,用户跟踪模式有3种:

    MKUserTrackingModeNone 。没实用户跟踪模式;

    MKUserTrackingModeFollow 。能够跟踪用户的位置变化;

    MKUserTrackingModeFollowWithHeading 。能够跟踪用户的位置和方向变化;

    然后,我们还须要实现地图视图托付方法mapView:didUpdateUserLocation:,它的代码例如以下:

    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    
    {
    
    _mapView.centerCoordinate = userLocation.location.coordinate;
    
    }


    该托付方法在定位服务更新完毕用户位置时候回调该方法,我们在该方法中又一次调整地图的中心点为当前用户的中心点,当中_mapView.centerCoordinate = userLocation.location.coordinate语句就是实现该目的。

    这几行代码就能够跟踪用户位置的变化了,可是为了这样一个小的案例拿着iPhone在外面跑一圈进行測试没有必要。能够使用模拟器測试,模拟器有几个固定的模式能够发出连续变化的数据。測试执行在画面中会有一个小圆圈,它依照我们设定的速度一直执行。

    8

  • 相关阅读:
    OOm是否可以try catch ?
    Java中两个线程是否可以同时访问同一个对象的两个不同的synchronized方法?
    PHP请求ws出现的问题
    AndFix注意事项
    thinkphp 查表返回的数组,js解析有UNICode编码,解决办法
    thinkphp用ajax遇到的坑——ajax请求没有反应
    用php获取js变量的值
    android项目安装报错:INSTALL_FAILED_CONFLICTING_PROVIDER
    96
    wuti
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4548606.html
Copyright © 2011-2022 走看看