地图与定位之大头针视图

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

在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中

//
//  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;
     //代理设置
    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:@"map.png"];
    [self.mapView addAnnotation:annotation];

    //定义长按手势
    UILongPressGestureRecognizer *longPressGestureRecognizer=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(LongTap:)];
    [self.mapView addGestureRecognizer:longPressGestureRecognizer];

}
-(void)LongTap:(UILongPressGestureRecognizer *)gestureRecongizer
{
    if (gestureRecongizer.state==UIGestureRecognizerStateBegan) {
        NSLog(@"开始长按");
        //获取mapview手指点击位置
        CGPoint point=[gestureRecongizer locationInView:self.mapView];
        //转化为经纬度
        CLLocationCoordinate2D coordinate2D=[self.mapView convertPoint:point toCoordinateFromView:self.mapView];
        //把当前位置转为地理位置
        CLGeocoder *geocoder=[[CLGeocoder alloc]init];
        CLLocation *location=[[CLLocation alloc]initWithLatitude:coordinate2D.latitude longitude:coordinate2D.longitude];
        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            if (error) {
                NSLog(@"失败:%@",error);
                return ;
            }
            if (placemarks.count>0) {
                CLPlacemark *placemark=[placemarks firstObject];

                MyAnnotation *annotation=[[MyAnnotation alloc]initWithCoordinate:coordinate2D title:placemark.name subtitle:placemark.thoroughfare];
                annotation.image=[UIImage imageNamed:@"map.png"];
                NSLog(@"城市:%@",placemark.locality);
                NSLog(@"区:%@",placemark.subLocality);
                NSLog(@"省份:%@",placemark.administrativeArea);
                [self.mapView addAnnotation:annotation];
            }
        }];

    }
    else if(gestureRecongizer.state==UIGestureRecognizerStateChanged)
    {
        NSLog(@"长按移动");
    }
    else if(gestureRecongizer.state==UIGestureRecognizerStateEnded)
    {
         NSLog(@"长按结束");
    }

}
-(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:@"map.png"];
        [self.mapView addAnnotation:annotation];

    }
}

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
     //由于当前位置的标注也是一个大头针,所以此时需要判断,此代理方法返回nil使用默认大头针视图
    if ([annotation isKindOfClass:[MyAnnotation class]]) {
        static NSString *key=@"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);
            //详情左视图
            UIImageView *imgView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"email.png"]];
            imgView.frame=CGRectMake(20, 20, 40, 40);
            annotationView.leftCalloutAccessoryView=imgView;
            UIButton *btn=[UIButton buttonWithType:UIButtonTypeInfoDark];
            btn.frame=CGRectMake(20, 20, 40, 40);
            annotationView.rightCalloutAccessoryView=btn;

        }
        //修改大头针视图
        //重新设置此类大头针视图的大头针模型(因为有可能是从缓存池中取出来的,位置是放到缓存池时的位置)
        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-29 17:26:43

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

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

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

iOS开发系列--地图与定位源代码详解_IOS

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

iOS开发之地图与定位

无论是QQ还是微信的移动客户端都少不了定位功能,之前在微信demo中没有添加定位功能,今天就写个定位的小demo来了解一下定位和地图的东西.地图和定位看上去是挺高大上一东西,其实用法比TableView简单多了,下面的Demo是用的iOS中自带的地图和定位,当然了也可以用第三方的来加载地图,比如百度地图啥的,在这就不赘述了.今天的博客主要是介绍MKMapView的使用,MapView的使用和其他组件的用法差不多,MapView用的是委托回调,在使用mapView的Controller中要实现MK

iOS原生地图开发指南续——大头针与自定义标注

iOS原生地图开发指南续--大头针与自定义标注 在上一篇博客中http://my.oschina.net/u/2340880/blog/415360系统总结了iOS原生地图框架MapKit中主体地图的设置与应用.这篇是上一篇的一个后续,总结了系统的大头针视图以及自定义标注视图的方法. 一.先来认识一个协议MKAnnotation 官方文档告诉我们,所有标注的类必须遵守这个协议.所以可以了解,标注这个概念在逻辑属性和视图上是分开的.先来看下这个协议声明了哪些方法: ? 1 2 3 4 5 6 7

手机百度地图怎么定位 百度地图定位方法

注意:手机定位功能必须允许百度访问否则百度地图无法定位了,因为要有访问手机定位服务的权限才可以哦. 先打开手机的网络(数据流量或无线WiFi)和GPS定位 2.打开百度手机地图 3.点击首页左下角的[指南针]标志 4.定位成功,同时自动切换视图 好了这样你会发现你的定位已经指定你指定的位置了,以上就是小编为各位整理的关于手机百度地图定位的操作方法了.

地图与定位之定位

今天开始总结一下地图与定位.首先要使用定位就要引用框架CoreLocation.framework,在类文件中加入#import <CoreLocation/CoreLocation.h>,其次在IOS8中调用的时候要在Info.plist中加两个Key,NSLocationAlwaysUsageDescription和NSLocationWhenInUseUsageDescription,具体参考http://www.cnblogs.com/kenshincui/p/4125570.html

服务器-关于百度地图API ——overlay中大头针的问题

问题描述 关于百度地图API --overlay中大头针的问题 在做一个校园停车管理系统,植入了百度地图,overlay界面中有大头针,我想点击一下可以显示停车位是否有空位,服务器用的是myeclipse,硬件都有,现在主要是如何在服务器端和客户端写代码,请大神帮帮忙 解决方案 电脑版?那可以用百度地图js api试试啊,你可以在服务器上判断好有空位的就给定一个大头针.

百度地图开发 定位 重新回到我的位置失败

问题描述 百度地图开发 定位 重新回到我的位置失败 在学习百度地图开发 定位之后 把地图滑到别的地方 再按我的位置 回来后加载不出地图 如图:![![图片说明图片说明 代码如下: case R.id.id_map_location: centerToMyLocation(); break; private void centerToMyLocation() { LatLng latLng = new LatLng(mLatiyude, mLongtude); MapStatusUpdate ms

百度地图~保留地图的定位效果,但是下面的地图不需要保留!

问题描述 百度地图~保留地图的定位效果,但是下面的地图不需要保留! 怎么隐藏百度地图的地图 ,定位效果还是要的.求大牛指点! 保留地图的定位效果,但是下面的地图不需要保留! 解决方案 什么意思?是只要定位好的地图,不能拖拽[放大]别的?有属性,不可方法,,不可拖拽啊... 解决方案二: 只留BMap.Marker?地图里面的图片全部隐藏起来?..那你还用百度地图干嘛,图片隐藏起来了.还不如直接写个浮动层就行了