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

            继上一章,使用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

@效果图:



原文地址:https://www.cnblogs.com/brucemengbm/p/6853566.html