首页 > 代码库 > 位置与地图(二)地图的使用以及标注地图

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

            继上一章,使用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;
        //  将大头针头部图标换成自定义的图片
        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

@效果图: