天天看点

iOS中实现地图时的几个点

努力学习,当然也不能忘记总结。趁着休息的时间总结一下关于Core Location与Map Kit的一些值得注意的知识点:

当然我们知道如何在模拟器上显示地图:

//  添加MapKit框架
    MKMapView *mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
//    设置地图的显示类型,标准、卫星、混合,这里定义为混合型的
    mapView.mapType = MKMapTypeHybrid;
//    添加地图
    [self.view addSubview:mapView];
           

而在设计地图的时候能够显示还不够,主要的是如何配置地图的一些属性。

//    定义地图是否可以放大、缩小,Default is YES
    mapView.zoomEnabled = YES;
//    定义地图是否可以滑动,Default is YES
    mapView.scrollEnabled = YES;
//    定义地图是否可以旋转, default YES on Mac OS X and on iOS 7.0 and later.
    mapView.rotateEnabled = YES;
//    定义地图相机的俯仰信息是否被使用 Default same to rotateEnable
    mapView.pitchEnabled = YES;
//    定义地图是否显示用户当前位置,Default is NO
    mapView.showsUserLocation = YES;
           

地图显示用户位置的时候,在iOS早期版本用的是大头针形状的,现在改成了一个蓝色点。当然地图的属性也远不止这些,在而这些只是常用的几个,想要掌握它们需要我们都一一尝试一下还是比较好的.

另外我们也可以自己定义地图的锁定坐标,在一个地区的地理坐标位置的时候,(纬度,经度)北纬是正数,东经是正数,这里比较容易出错的是,定义coordinate时不能直接赋值而是需要:

CLLocationCoordinate2D coordinate;
    coordinate.latitude = 34.7568711;
    coordinate.longitude = 113.663221;</span>
           

错误的赋值格式是: CLLocationCoordinate2D coordinate = {34.7568711,113.663221}

接着设置显示区域的精度,值越小表示的范围越精确,值越大表示的范围越大,但是不精确

MKCoordinateSpan span = {100,100};
           

根据地理坐标和span创建表示区域的值。(通常一个圆,和半径)可以使用四种方法:

1、 MKCoordinateRegion region = {coordinate,span}; //初始化方法
     2、 MKCoordinateRegion region;
         region = {coordinate,span};
     3、 region = MKCoordinateRegionMake(coordinate, span);
     4、 region = MKCoordinateRegionMakeWithDistance(coordinate, 111*1000*span.latitudeDelta, 111*1000*span.longitudeDelta);
           

最后将显示的区域告诉地图:

[mapView setRegion:region];
           

其三,对地图进行位置管理:

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;//当让这里样遵守CLLocationManagerDelegate协议
    locationManager.distanceFilter = kCLDistanceFilterNone;//指定以米为单位的最小更新距离。客户端将不会收到通知如果小于规定值的动作,除非精度有所提高。通过在kCLDistanceFilterNone,是获得所有运动的通知。默认情况下, 使用kCLDistanceFilterNone。
//    设置位置管理的精度
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
           

这里需要注意的是:对于位置管理来说, 并非是精度越大越好。 因为 GPS模块, 是手机最耗电的模块, 所以为最大限度让我们应用程序省电, 需要根据具体的应用来设定具体的精度。

最后开始更新位置显示:

[locationManager startUpdatingLocation];
           

而在CLLocationManager的delegate方法中,我们经常用到的当然是更新位置的方法,这里提供了两个方法:

- (void)locationManager:(CLLocationManager *)manager
	didUpdateToLocation:(CLLocation *)newLocation
		   fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"%@",NSStringFromSelector(_cmd));
}

- (void)locationManager:(CLLocationManager *)manager
	 didUpdateLocations:(NSArray *)locations
{
    NSLog(@"%s",__func__);
}
           

对于这两种方法看过苹果官方的解释会知道前一个方法是不推荐的用的,主推后一个方法:

*  locationManager:didUpdateToLocation:fromLocation:

 *  

 *  Discussion:

 *    Invoked when a new location is available. oldLocation may be nil if there is no previous location

 *    available.

 *

 *    This method is deprecated. If locationManager:didUpdateLocations: is

 *    implemented, this method will not be called.

意思是在使用更新位置方法的时候,如果调用了后一个方法,前一个方法是不会被调用的。所以我们一般使用后一个方法。

最后,我们在设计地图的时候,有时候会遇到显示大头针界面的需求,以及地图的注解等等。而这些知识会在下一次与大家继续探讨。