zoukankan      html  css  js  c++  java
  • 地图(基本应用,location管理器,注解)

    #import "ViewController.h"
    #import <MapKit/MapKit.h>

    @interface ViewController () <CLLocationManagerDelegate,MKMapViewDelegate>

    //这里为什么要把它设置成为属性?为了就是解决强引用的问题,如果不设置,locationManger会在花括号之后,就会释放掉,这样就看不到了我们想要的地址改变信息,arc情况下,解决办法只有把它设置为成员属性
    @property (retain,nonatomic) CLLocationManager *locationManger;

    @end

    @implementation ViewController

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
    //   创建显示地图的视图MKMapView
        MKMapView *map = [[MKMapView alloc]initWithFrame:self.view.bounds];
       

    //    这里打了一个tag,用于以后识别要显示的地图试图
        map.tag = 1000;
        

    //    设置span
    //    span 指的是显示地图精确度,值越小显示的地图数据越精确,越详细,如果值越大, 则显示的区域越大
        MKCoordinateSpan span ={0.1,0.1};
        //    结构体的第二种赋值方法
        //    MKCoordinateSpan span2;
        //    span2.latitudeDelta = 100;
        //    span2.longitudeDelta = 100;
        
        //    采用C函数来创建结构体的具体数据
        //    MKCoordinateSpan span3;
        //    span3 = MKCoordinateSpanMake(100, 100);
        
        /*
         *在OC环境下 对于结构体变量的赋值,有三种方式:
         1、初始化的时候, 直接采用花括号语法, 在花括里,按结构体声明的顺序依次赋值
         2、先声明结构体变量,可以使用点语法,来指定相对应的成员变量的值
         3、采用SDK的C 函数直接完成设置
         */

        
    //    设置经纬度————是地图当前显示位置的地理坐标
        CLLocationCoordinate2D coordinate = {34.7568711,113.663221};
        
        
    //    设置题图上显示的区域,这里需要设置两个参数————CLLocationCoordinate2D还有MKCoordinateSpan
        MKCoordinateRegion region = {coordinate,span};
        
    //    设置显示界面的region就是上面的MKCoordinateRegion
        map.region = region;
       
    //    显示当前位置
        map.showsUserLocation =YES;
    //     可放大缩小
        map.zoomEnabled = YES;
    //     可滑动
        map.scrollEnabled = YES;
       
    //    设置显示的地图的类型————————三种类型
        //    显示卫星地图
    //        map.mapType = MKMapTypeSatellite;
        //    显示卫星地图和标准地图的混合
        //    map.mapType = MKMapTypeHybrid;
        //    显示标准也就是普通地图,这是默认地图类型
            map.mapType = MKMapTypeStandard;
        
        [self.view addSubview:map];
        
    //    添加地图的地址管理器————CLLocationManager
       self.locationManger = [[CLLocationManager alloc] init];
        
    //    当设备移动每超过distanceFilter设置的米数时,就会更新一次位置信息。
    //    理解为地图的位置移动一定距离,地图的信息就会更新
        self.locationManger.distanceFilter = 100;

    //   地图位置信息的精确度,这里设置为best,精确度就是意味着在10米之内
    //    extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation;
    //    extern const CLLocationAccuracy kCLLocationAccuracyBest;
    //    extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
    //    extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
    //    extern const CLLocationAccuracy kCLLocationAccuracyKilometer;
    //    extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;
        
        self.locationManger.desiredAccuracy = kCLLocationAccuracyBest;
        
    //    设置代理
        
        self.locationManger.delegate = self;
        
    //    这一句不能忘,只有设置了startUpdatingLocation,才能运行
        [self.locationManger startUpdatingLocation];
     
    //   注解类很重要,如果想自定义地图上的一些文本和图标,就必须用到——————注解
    //  注解类,用于提供注解数据,真正用于显示注解视图,需要在委托方法去创建
        MKPointAnnotation *pointAnnotation = [[MKPointAnnotation alloc]init];
        
        
        pointAnnotation.title = @"河南省";
        pointAnnotation.subtitle = @"郑州市";

        //   设置注解的位置,这里就需要用到————coordinate
        pointAnnotation.coordinate =CLLocationCoordinate2DMake(34.7568711,113.663221);
        
    //    把注解加到地图视图上
        [map addAnnotation:pointAnnotation];

    }

    #pragma mark -
    #pragma mark CLLocationManagerDelegate
    //第一个参数,表示是哪个地址管理器
    //第二个参数,表示当位置更新的时候, 新位置信息。
    //第三个参数,表示位置更新时, 老的位置信息。


    //   这里要做到的效果是——————做到位置的改变,地图显示随着位置的改变,转变视图的界面
    - (void)locationManager:(CLLocationManager *)manager
        didUpdateToLocation:(CLLocation *)newLocation
               fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"newLocation's lat is :%f, long is :%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
        NSLog(@"oldLocation's lat is :%f, long is :%f",oldLocation.coordinate.latitude,oldLocation.coordinate.longitude);
        
    //    设置span
    //    span 指的是显示地图精确度,值越小显示的地图数据越精确,越详细,如果值越大, 则显示的区域越大
    //    这里调用了c语言的方法进行赋值------c赋值
        MKCoordinateSpan span = MKCoordinateSpanMake(1, 1);

    //    设置地图上的显示区域
        MKCoordinateRegion region = {newLocation.coordinate,span};
        
    //    这里用tag,表示修改后现实的界面还是以前我们创建的map
    //    另一种方法是把它设置成为成员属性,也可以答到效果
        MKMapView *map = (MKMapView *)[self.view viewWithTag:1000];
        
    //  设置地图界面的显示区域,同时再加上一个动画效果,
    //    类似于map.region = region
        [map setRegion:region animated:YES];
     
        
    //   计算两个位置之间的相隔距离, 单位是米----CLLocationDistance
        
        CLLocationDistance distance  = [newLocation distanceFromLocation:oldLocation];
        NSLog(@"两地之间的距离是:%f",distance/1000);
        
        
    //    调用此方法, 是终止位置管理器更新位置信息,在实际应用中, 一定调用这个方法, 解决设备耗电量问题。
    //    [self.locationMgr stopUpdatingLocation];

    }

    #if 0
    //  这个和上面的方法其实是一个方法,6.0以后,系统推荐使用这种方法,同时存在,上面的方法无效
    - (void)locationManager:(CLLocationManager *)manager
         didUpdateLocations:(NSArray *)locations
    {
    //    打印当面方法
        NSLog(@"%@",NSStringFromSelector(_cmd));
        NSLog(@"%@",NSStringFromSelector(@selector(locationManager:didUpdateLocations:)));
        
    //   数组locations的最后一个元素, 是最新的位置信息
    //    通过地址管理器的地址数组,取最新地址
        CLLocation *newLocation = locations[0];

    //  设置span
        MKCoordinateSpan span = MKCoordinateSpanMake(1, 1);
     
    //  设置region
        MKCoordinateRegion region = MKCoordinateRegionMake(newLocation.coordinate, span);
        
    //    这里用tag,表示修改后现实的界面还是以前我们创建的map
    //    另一种方法是把它设置成为成员属性,也可以答到效果
        MKMapView *map = (MKMapView *)[self.view viewWithTag:1000];
     
    //  设置地图界面的显示区域,同时再加上一个动画效果,
    //    类似于map.region = region
        [map setRegion:region animated:YES];
        
    }
    #endif
    -(void)locationManager:(CLLocationManager *)manager
    didFailWithError:(NSError *)error
    {
        NSLog(@"%s",__func__);
        
        NSLog(@"%@",error);

    }

    #pragma mark -
    #pragma mark MKMapViewDelegate
    // 这里是实现注解的具体的代理方法
    //这里有两个参数————————MKMapView还有——————————annotation
    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
    //    如果是系统默认的用户当前地址,返回默认的注解,
        if ([annotation isKindOfClass:[MKUserLocation class]]) {
            return nil;
        }
        
    //   注解创建的方法和tabelview很像
    //    都是先创建一个标识
        static NSString *pinViewIndentifier =@"pinViewIndentifier";
        
    //    从可重用队列里取出来
        MKPinAnnotationView *pinView =(MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinViewIndentifier];
     
    //    如果为空,创建pinview;
        if (pinView == nil) {
            pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinViewIndentifier];
        }

    //        修改大头针的显示颜色
        pinView.pinColor =MKPinAnnotationColorGreen;

    //        让大头针出现的时候, 展现从天而降的效果
        pinView.animatesDrop =YES;

    //        如果想要展示上述效果, 需要设置canShowCallout为yes
        pinView.canShowCallout =YES;
        
        return pinView;
    }
    @end

  • 相关阅读:
    运行了unittest没有结果返回
    python学习笔记11.2-unittest的使用与报告生成
    python学习笔记11.1-类的继承与动态属性的设置
    docker概念
    python学习笔记10-方法
    python学习笔记9-类和对象
    python学习笔记8-异常处理
    python学习笔记2-字典和列表
    3.JavaScript-语法、关键保留字及变量
    如何实现导航菜单栏中的二级下拉菜单?
  • 原文地址:https://www.cnblogs.com/wangdelong/p/3848492.html
Copyright © 2011-2022 走看看