码迷,mamicode.com
首页 > 其他好文 > 详细

地图与定位之地图、大头针

时间:2015-04-20 14:52:17      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:

 添加框架CoreLocation、MapKit框架

一、首先了解大头针

要添加大头针需实现协议MKAnnotation ,由下图可以看到,一定要实现coordinate属性。

技术分享

二、实现大头针协议

添加MyAnnotation类

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
//MKAnnotation是一个协议 ,添加大头针久需要实现该协议
//coordinate 属性是必须的,所以需要实现该属性
@interface MyAnnotation : NSObject<MKAnnotation>
-(id)initWithCoordinate:(CLLocationCoordinate2D)coordinate title:(NSString *)title subtitle:(NSString *)subtitle;
@end

 

//
//  MyAnnotation.m
//  MapView
//
//  Created by City--Online on 15/4/20.
//  Copyright (c) 2015年 CYW. All rights reserved.
//

#import "MyAnnotation.h"


@interface MyAnnotation ()
{
    CLLocationCoordinate2D _coordinate;
    NSString *_title;
    NSString *_subTitle;
}
@end

@implementation MyAnnotation
-(id)initWithCoordinate:(CLLocationCoordinate2D)coordinate title:(NSString *)title subtitle:(NSString *)subtitle
{
    if (self==[super init]) {
        _coordinate=coordinate;
        _title=title;
        _subTitle=subtitle;
    }
    return self;
}
// 必选
-(CLLocationCoordinate2D)coordinate
{
    
    return _coordinate;
}
//可选
-(NSString *)title
{
    return _title;
}
-(NSString *)subtitle
{
    return _subTitle;
}
@end

 三、地图和添加大头针

//
//  ViewController.m
//  MapView
//
//  Created by City--Online on 15/4/17.
//  Copyright (c) 2015年 CYW. All rights reserved.
//

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
#import "MyAnnotation.h"
@interface ViewController ()<CLLocationManagerDelegate,MKMapViewDelegate>
@property(nonatomic,strong)MKMapView *mapView;
@property(nonatomic,strong)CLLocationManager *locationManager;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _locationManager=[[CLLocationManager alloc]init];
    BOOL enable=[CLLocationManager locationServicesEnabled];
    NSLog(@"%d",[CLLocationManager authorizationStatus]);
    if (!enable) {
        NSLog(@"用户未开启定位服务,无法定位");
        return;
    }
    else if ([CLLocationManager authorizationStatus]<3)
    {
        [_locationManager requestWhenInUseAuthorization];
    }
    CLLocationDistance distance=10.0;
    _locationManager.distanceFilter=distance;
    _locationManager.delegate=self;
    _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    [_locationManager startUpdatingLocation];
    self.mapView=[[MKMapView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    
    //地图类型
//    typedef NS_ENUM(NSUInteger, MKMapType) {
//        MKMapTypeStandard = 0, //标准地图
//        MKMapTypeSatellite,   //卫星地图
//        MKMapTypeHybrid       //混合地图
//    }
    self.mapView.mapType=MKMapTypeStandard;
    //是否定位当前位置 否显示当前位置
    self.mapView.showsUserLocation=YES;
    
//    typedef struct {
//        CLLocationCoordinate2D center;
//        MKCoordinateSpan span;
//    } MKCoordinateRegion;
    
    //中心点经纬度
    CLLocationCoordinate2D  locationCoordinate2D;
    locationCoordinate2D.latitude=22.544349;
    locationCoordinate2D.longitude= 113.94787;
    //范围比例尺
    MKCoordinateSpan coordinateSpan;
    //纬度
    coordinateSpan.latitudeDelta=0.05;
    //经度
    coordinateSpan.longitudeDelta=0.05;
    //设置显示区域
    MKCoordinateRegion coordinateRegion;
    coordinateRegion.center=locationCoordinate2D;
    coordinateRegion.span=coordinateSpan;
    [self.mapView setRegion:coordinateRegion animated:YES];
//    self.mapView.region=coordinateRegion;
    [self.view addSubview:self.mapView];
    
    UISegmentedControl *segmentedControl=[[UISegmentedControl alloc]initWithItems:@[@"普通地图",@"卫星地图",@"混合地图"]];
    segmentedControl.selectedSegmentIndex=0;
    [segmentedControl addTarget:self action:@selector(selectSegmentIndex:) forControlEvents:UIControlEventValueChanged];
    self.navigationItem.titleView=segmentedControl;

    //定义大头针类
    MyAnnotation *annotation=[[MyAnnotation alloc]initWithCoordinate:locationCoordinate2D title:@"默认指定" subtitle:@"子标题"];
    [self.mapView addAnnotation:annotation];
    
   
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    if (locations.count>0) {
        CLLocation *location=[locations firstObject];
        CLLocationCoordinate2D locationCoordinate2D =location.coordinate;
        [self.mapView setRegion:MKCoordinateRegionMake(locationCoordinate2D, self.mapView.region.span) animated:YES];
       
        NSLog(@"%lf ,%lf",locationCoordinate2D.longitude,locationCoordinate2D.longitude);
        
        MyAnnotation *annotation=[[MyAnnotation alloc]initWithCoordinate:locationCoordinate2D title:@"定位位置" subtitle:@"子标题"];
        [self.mapView addAnnotation:annotation];
       
    }
}
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    MyAnnotation *annotation=view.annotation;
    NSLog(@"%@",annotation.title);
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"定位失败");
    NSLog(@"%@",error);
}
- (void)selectSegmentIndex:(UISegmentedControl *)control
{
    NSInteger index = control.selectedSegmentIndex;
    
    /*
     MKMapTypeStandard  普通地图(标准地图),
     MKMapTypeSatellite 卫星地图,
     MKMapTypeHybrid    混合地图
     */
    
    MKMapType mapType;
    
    switch (index)
    {
            //普通地图
        case 0:
            mapType = MKMapTypeStandard;
            break;
            //卫星地图
        case 1:
            mapType = MKMapTypeSatellite;
            break;
            //普通和卫星的混合地图
        case 2:
            mapType = MKMapTypeHybrid;
            break;
            
        default:
            break;
    }
    
    //改变地图类型
    self.mapView.mapType = mapType;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 四、注意

1.在info.plist中添加Key:NSLocationWhenInUseUsageDescription

2.在AppDelegate中添加导航控制器

技术分享

 

地图与定位之地图、大头针

标签:

原文地址:http://www.cnblogs.com/cuiyw/p/4441475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!