• 位置与地图(二)地图的使用以及标注地图


                继上一章,使用CoreLocation框架获取了当前设备的位置,这一章介绍地图的使用.

                 首先,导入<MapKit.framework>框架

                  #import <MapKit/MapKit.h>

    @main代码演示样例

    main.h
    
    #import <UIKit/UIKit.h>
    #import <MapKit/MapKit.h>
    //  引用地图协议
    @interface HMTMainViewController : UIViewController<MKMapViewDelegate>
    
    @end
    
    main.m
    
    //
    //  HMTMainViewController.m
    //  Map
    //
    //  Created by HMT on 14-6-21.
    //  Copyright (c) 2014年 humingtao. All rights reserved.
    //
    
    #import "HMTMainViewController.h"
    #import "HMTAnnotation.h"
    
    @interface HMTMainViewController ()
    
    @property (nonatomic ,strong) MKMapView *mapView;
    
    @end
    
    @implementation HMTMainViewController
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    
    {
        
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor redColor];
        
        // Do any additional setup after loading the view.
        
        self.navigationItem.title = @"地图标注";
        self.mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
        
        //  是否显示用户当前位置
        self.mapView.showsUserLocation = YES;
        //  设置代理
        self.mapView.delegate = self;
        
        //  地图显示类型
        /**
         *      MKMapTypeStandard = 0, //  标准地图
         *      MKMapTypeSatellite,    //  卫星地图
         *      MKMapTypeHybrid        //  混合地图
         */
        self.mapView.mapType = MKMapTypeStandard;
        //  经纬度
        CLLocationCoordinate2D coord2D = {39.910650,116.47030};
        //  显示范围,数值越大,范围就越大
        MKCoordinateSpan span = {0.1,0.1};
        //  显示区域
        MKCoordinateRegion region = {coord2D,span};
        //  给地图设置显示区域
        [self.mapView setRegion:region animated:YES];
        //  是否同意缩放
        //self.mapView.zoomEnabled = NO;
        //  是否同意滚动
        //self.mapView.scrollEnabled = NO;
    
        //  初始化自己定义Annotation(能够设置多个)
        HMTAnnotation *annotation = [[HMTAnnotation alloc] initWithCGLocation:coord2D];
        //  设置标题
        annotation.title = @"自己定义标注位置";
        //  设置子标题
        annotation.subtitle = @"子标题";
        //  将标注加入到地图上(运行这步,就会运行以下的代理方法viewForAnnotation)
        [self.mapView addAnnotation:annotation];
        
        [self.view addSubview:_mapView];
        
    }
    
    //   返回标注视图(大头针视图)
    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    
        /**
         *  是不是有点像自己定义UITableViewCell一样
         */
        static NSString *identifier = @"annotation";
        //  复用标注视图(MKPinAnnotationView是大头针视图,继承自MKAnnotation)
        MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
        if (annotationView == nil) {
            annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        }
        //  推断是否为自己定义的标注视图
        if ([annotation isKindOfClass:[HMTAnnotation class]]) {
            
            //  设置大头针圆圈颜色
            annotationView.pinColor = MKPinAnnotationColorGreen;
            //  点击头针红色圆圈是否显示上面设置好的标题视图
            annotationView.canShowCallout = YES;
            //  要自己定义锚点图片,可考虑使用MKAnnotationView;MKPinAnnotationView仅仅能是以大头针形式显示!

    。!

    annotationView.image = [UIImage imageNamed:@"customImage"]; // 加入标题视图右边视图(还有左边视图,详细可自行查看API) UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [button addTarget:self action:@selector(didClickAnnotationViewRightButtonAction:) forControlEvents:UIControlEventTouchUpInside]; annotationView.rightCalloutAccessoryView = button; // 是否以动画形式显示标注(从天而降) annotationView.animatesDrop = YES; annotationView.annotation = annotation; // 返回自己定义的标注视图 return annotationView; }else{ // 当前设备位置的标注视图,返回nil,当前位置会创建一个默认的标注视图 return nil; } } - (void)didClickAnnotationViewRightButtonAction:(UIButton *)button{ NSLog(@"%d %s",__LINE__,__FUNCTION__); } // 更新当前位置调用 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{ NSLog(@"%d %s",__LINE__,__FUNCTION__); } // 选中标注视图 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{ NSLog(@"%d %s",__LINE__,__FUNCTION__); } // 地图的现实区域改变了调用 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ NSLog(@"%d %s",__LINE__,__FUNCTION__); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end


    @自己定义MKAnnotationView

    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>
    //  引入MKAnnotation协议,切记不能忘记!!!!!!!!!
    @interface HMTAnnotation : NSObject<MKAnnotation>
    
    @property (nonatomic,readonly) CLLocationCoordinate2D coordinate;  //  坐标
    @property (nonatomic,copy) NSString *title;     //  位置名称
    @property (nonatomic,copy) NSString *subtitle;  //  位置子信息(可选)
    
    - (id)initWithCGLocation:(CLLocationCoordinate2D) coordinate;
    
    @end
    
    #import "HMTAnnotation.h"
    
    @implementation HMTAnnotation
    
    - (id)initWithCGLocation:(CLLocationCoordinate2D)coordinate{
    
        if (self = [super init]) {
            
            _coordinate = coordinate;
        }
        return self;
    }
    
    @end
    

    @效果图:



  • 相关阅读:
    51单片机串口实验时波特率怎么调才合适
    什么是GPS的冷启动、温启动和热启动?
    单片机pc指针
    80C51存储器与C51内存优化
    C51变量的存储
    单片机结构体内存的分配
    单片机内程序运行的时候ram空间是如何分配的?
    51单片机存储器结构
    AD分辨率和精度区别
    过采样与欠采样
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6853566.html
Copyright © 2020-2023  润新知