地图与定位之大头针视图

该博文在上一博文地图与定位之地图、大头针的基础上完成。

在MyAnnotation.h 中增加属性

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

在ViewController.m中

#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;
     //代理设置
    self.mapView.delegate=self;

//    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;

//    typedef NS_ENUM(NSInteger, MKUserTrackingMode) {
//        MKUserTrackingModeNone = 0, // the user‘s location is not followed
//        MKUserTrackingModeFollow, // the map follows the user‘s location
//        MKUserTrackingModeFollowWithHeading, // the map follows the user‘s location and heading
//    }
    self.mapView.userTrackingMode=MKUserTrackingModeFollow;
    [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:@"子标题"];
    annotation.image=[UIImage imageNamed:@"annotation.png"];
    [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:@"子标题"];
        annotation.image=[UIImage imageNamed:@"annotation.png"];
        [self.mapView addAnnotation:annotation];

    }
}
 //默认返回nil,采用服用的思想
//显示大头针时调用,注意方法中的annotation参数是即将显示的大头针对象
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
     //由于当前位置的标注也是一个大头针,所以此时需要判断,此代理方法返回nil使用默认大头针视图
    if ([annotation isKindOfClass:[MyAnnotation class]]) {
        static NSString *[email protected]"annotation";
        MKAnnotationView *annotationView=[self.mapView dequeueReusableAnnotationViewWithIdentifier:key];
        if (annotationView==nil) {
            annotationView=[[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:key];
            //允许交互点击
            annotationView.canShowCallout=true;
            //定义详情视图偏移量
            annotationView.calloutOffset=CGPointMake(0, 1);
            //详情左视图
            annotationView.leftCalloutAccessoryView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"email.png"]];

        }
        //修改大头针视图
        //重新设置此类大头针视图的大头针模型(因为有可能是从缓存池中取出来的,位置是放到缓存池时的位置)
        annotationView.annotation=annotation;
        //设置大头针图片
        annotationView.image=((MyAnnotation *)annotation).image;
        return annotationView;
    }
    else
    {
        return nil;
    }
}
//大头针选中
-(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

时间: 2024-10-10 15:53:46

地图与定位之大头针视图的相关文章

iOS进阶_地图上定位的标志——大头针

一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大头针类,我自定义的为MyAnnotation 大头针: 在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的“大头针”.只要一个NSObject类实现MKAnnotation协议就可以作为一个大头针,通常会重写协议中coordinate(标记位置).title(标题).subtitl

IOS_地图_定位_天气预报_Block回调_单例

H:/1021/00_block回调.h /* 通过block回调 定义block代码块,目的是解析完成之后调用 返回值是 void 参数是 数组,里面的每个成员是一个NSString*/ typedef void(^WeatherFinishedBlock)(NSArray *dataList); @interface WeatherXMLPaser : NSObject // 解析器解析数据,参数1是要解析的数据,参数2是解析完毕回调的代码块 - (void)parserWeatherDat

iOS开发--地图与定位

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒 店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开 发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要 实现地图.导航功能,往往需要先熟悉定位功能

iOS开发系列--地图与定位

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

iOS地图及定位功能基本实现的详尽描述

首先创建一个viewController: 添加MapKit,CoreLocation框架 一.添加地图 1.初始化地图视图: @property (nonatomic, strong) MKMapView *mapView; self.mapView =[[MKMapView alloc]initWithFrame:self.view.bounds]; 2.设置地图的显示类型,三种:标准,卫星地图,混合 self.mapView.mapType { MKMapTypeStandard = 0,

IOS_地图与定位

知识点介绍 一. 定位 实现一次定位 CLLocation对象介绍 实现持续定位 请求用户授权 二. 地理编码 正地理编码 反地理编码 三. 地图的基本使用 显示用户位置 设置地图显示类型 根据用户位置显示对应的大头针信息 设置以用户所在位置为中心点 监听地图显示区域改变 iOS9新特性-显示交通状况 / 显示比例 / 显示指南针 四. 大头针的使用 添加大头针 自定义大头针1, 更改颜色, 设置掉落效果 自定义大头针2-更改大头针的图像 自定义大头针的代码封装 一. CoreLocation实

地图、定位 CLLocationManager CLGeocoder CLPlacemark

地图.定位 一.基本知识点 定位: 1.info.plist文件设置 ios8以后,使用定位需要在info.plist文件中添加两个字段NSLocationAlwaysUsageDescription和NSLocationWhenInUseUsageDescription 2.导入CoreLocation.framework框架并导入头文件 #import <CoreLocation/CoreLocation.h> 3.判断定位服务是否打开 if (![CLLocationManager lo

地图与定位(二)系统地图

iOS从6.0开始地图服务不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的.这样一来,如果在iOS6.0之前进行地图开发的话使用方法会有所不同,基于目前的情况其实使用iOS6.0之前版本的系统基本已经寥寥无几了,所有在接下来的内容中不会再针对iOS5及之前版本的地图开发进行介绍. 在iOS中进行地图开发主要有两种方式,一种是直接利用MapKit框架进行地图开发,利用这种方式可以对地图进行精准的控制:另一种方式是直接调用苹果官方自带的地图应用,主要用于一些简单的地图应用(例如

iOS开发——开发实战总结OC篇&amp;地图与定位(LBS)-MapKit篇

地图与定位(LBS)-MapKit篇 一:MapKit基本介绍 XIB 代码 二:框架没有导入 在Xcode5之后我们不需要在工程中导入苹果的框架,也就是,苹果会自动为神马导入,但是有几个前提 1:你必须import这个框架 2:你必须在项目中使用(需要第一个条件的支持) 只要上面每个条件不满足都会报上名的错误 三:基本属性的使用 1 // 1.设置地图显示类型 2 /** 3 MKMapTypeStandard = 0, // 标准 4 MKMapTypeSatellite, // 卫星 5