定位 - MapKit-自定义大头针

#import <Foundation/Foundation.h>

#import <MapKit/MapKit.h>

@interface PPAnnotation : NSObject<MKAnnotation>

/**

*  大头针的位置

*/

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;

/**

*  大头针标题

*/

@property (nonatomic, copy) NSString *title;

/**

*  大头针的子标题

*/

@property (nonatomic, copy) NSString *subtitle;

/**

*  图标

*/

@property (nonatomic, copy) NSString *icon;

@end

------------------------------------------------------------------------------------------------------------------

#import <MapKit/MapKit.h>

@interface PPAnnotationView : MKAnnotationView

/**

*  快速创建 大头针

*

*  @param mapView mapView

*/

+ (instancetype)annotationViewWithMap:(MKMapView *)mapView;

@end

#import "PPAnnotationView.h"

#import "PPAnnotation.h"

@implementation PPAnnotationView

- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier

{

if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {

// 初始化

// 设置显示标题

self.canShowCallout = YES;

// 设置辅助视图

self.leftCalloutAccessoryView = [[UISwitch alloc] init];

self.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];

}

return self;

}

+ (instancetype)annotationViewWithMap:(MKMapView *)mapView

{

static NSString *ID = @"anno";

// 1. 从缓存中取

// [注意] 默认情况下, MKAnnotationView 是无法显示的, 如果想自定义大头针, 需要使用MKAnnotationView的子类 MKPinAnnotationView

// [注意] 如果是自定义的大头针, 默认情况点击大头针不会显示标题和副标题, 需要手动设置显示

//    MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

PPAnnotationView *annoView = (PPAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

// 2. 如果缓存中没有, 创建一个新的大头针

if (annoView == nil) {

annoView = [[PPAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];

}

return annoView;

}

//- (void)setAnnotation:(id<MKAnnotation>)annotation

- (void)setAnnotation:(PPAnnotation *)annotation

{

[super setAnnotation:annotation];

// 处理自己特有的操作

self.image = [UIImage imageNamed:annotation.icon];

}

@end

---------------------------------------------------------------------------------------------

#import "ViewController.h"

//#import <MapKit/MapKit.h>

#import "PPAnnotation.h"

#import "PPAnnotationView.h"

@interface ViewController ()<MKMapViewDelegate>

/**

*  地图

*/

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

@property (nonatomic, strong) CLLocationManager *mgr;

@property (nonatomic, strong) CLGeocoder *geocoder;

@end

@implementation ViewController

/**

*  添加大头针

*/

- (IBAction)addAnnotation:(id)sender {

PPAnnotation * annotation = [[PPAnnotation alloc] init];

annotation.title = @"北京智德创辉网络科技有限公司";

annotation.subtitle = @"RO";

annotation.icon = @"category_4";

CGFloat latitude = 39.915094 + arc4random_uniform(20);

CGFloat longitude = 116.487775 + arc4random_uniform(20);

annotation.coordinate = CLLocationCoordinate2DMake(latitude, longitude);

[self.mapView addAnnotation:annotation];

}

- (CLLocationManager *)mgr{

if (!_mgr) {

_mgr = [[CLLocationManager alloc] init];

}

return _mgr;

}

- (CLGeocoder *)geocoder{

if (!_geocoder) {

_geocoder = [[CLGeocoder alloc] init];

}

return _geocoder;

}

- (void)viewDidLoad {

[super viewDidLoad];

// ios 8

if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {

[self.mgr requestAlwaysAuthorization];

}

// 设置代理

self.mapView.delegate = self;

// 设置模式

self.mapView.mapType = MKMapTypeStandard;

// 设置跟踪

self.mapView.userTrackingMode = MKUserTrackingModeFollow;

// 设置xuanzhuan

self.mapView.rotateEnabled = NO;

}

#pragma mark -MKMapViewDelegate

/**

*  每次添加大头针 都会调用此方法

*

*  @param mapView    地图

*  @param annotation 大头针模型

*/

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

{

LogYellow(@"%@",annotation);

// 对用户当前位置的大头针, 特殊处理 - MKUserLocation

if(![annotation isKindOfClass:[PPAnnotation class]]){

return nil;

}

// 1. 创建大头针

PPAnnotationView *annoView = [PPAnnotationView annotationViewWithMap:mapView];

// 2. 设置模型

annoView.annotation = annotation;

// 3. 返回大头针

return annoView;

}

/**

*  地图区域改变完成 会调用此方法

*/

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

{

NSLog(@"地图区域改变完成");

/**

*

CLLocationCoordinate2D center;

MKCoordinateSpan span;

*/

LogRed(@"%f --- %f",self.mapView.region.span.latitudeDelta,  self.mapView.region.span.longitudeDelta);

}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

{

[self.geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {

CLPlacemark *placemark = [placemarks firstObject];

userLocation.title = placemark.name;

userLocation.subtitle  = placemark.locality;

}];

// 移动地图到当前用户所在位置

[self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];

/*

// 设置地图显示的区域

CLLocationCoordinate2D center = userLocation.location.coordinate;

// 指定经纬度的跨度

MKCoordinateSpan span = MKCoordinateSpanMake(0.001, 0.0001);

// 将用户的当前位置 设置为中心点, 并且制定显示的跨度

MKCoordinateRegion region = MKCoordinateRegionMake(center, span);

[self.mapView setRegion:region animated:YES];

*/

}

时间: 2024-10-06 00:57:20

定位 - MapKit-自定义大头针的相关文章

(八十)MapKit放置系统默认大头针和自定义大头针

有关MapView的显示和定位在上一节已经说明,这一节说明如何在地图上放置大头针,以及设置点击大头针的视图. [系统默认大头针] mapView上放置大头针的方法是调用其addAnnotation:方法,需要注意的是,传入的是模型而不是大头针视图. - (void)addAnnotation:(id <MKAnnotation>)annotation; 通过这个方法,我们可以清楚的看到,annotation模型需要遵循MKAnnotation协议,我们打开这个协议,可以看到如下的内容: @pr

MapKit之大头针全面解析(使用系统大头针、自定义大头针callout视图、使用图片显示大头针)

首先了解一些相关知识点: 添加大头针到地图 在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的"大头针".大头针(Annotations)提供了一种方式来突出地图中具体的位置并可以提供相关的信息.我们能够使用大头针标记具体的地址,兴趣点和其他类型的目的地.当显示在地图上的时候,大头针可以使用图片作为标识,也能够点击大头针弹出小弹框提供相应的链接和具体内容.Figure6-1显示了系统标准的大头针样式标记具体的位置,并提供了小弹框显示额外的信息,使用箭头提示用户点击获取

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

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

【iOS开发-111】自定义大头针Annotation以及2种导航划线的方法介绍

(1)自定义大头针Annotation的样式,也就是定义view,主要的方法是如下,传递一个大头针annotation模型,然后返回一个MKAnnotationView,这个MKAnnotationView有一个image属性,设置这个属性,就能设置它的样式了. -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{ } 关键提示,这个MKAnnotati

iOS 地图中自定义大头针

1.继承MKAnnotationView. HYAnnotationView.h文件: + (instancetype)annotationViewWithMapView:(MKMapView *)mapView; HYAnnotationView.m文件: #import "HYAnnotation.h"//导入大头针model的头文件 @interface HYAnnotationView() @property (nonatomic, weak) UIImageView *ico

MKMapView自定义大头针

如何自定义大头针 ——设置 MKMapView 的代理 实现下面的代理方法,返回大头针控件 - ( MKAnnotationView *)mapView:( MKMapView *)mapView viewForAnnotation:( id< MKAnnotation >)annotation; 根据传进来的 ( id < MKAnnotation >)annotation 参数创建并返回对应的大头针控件 代理方法的使用注意 如果返回 nil ,显示出来的大头针就采取系统的默认样

对自定义大头针进行设置

#import <MapKit/MapKit.h> #import "MyPointAnnotation.h" //导入自定义的大头针 @interface MyAnnotationView : MKPinAnnotationView { MyPointAnnotation *myPointAnnotation; } @end #import "MyAnnotationView.h" @implementation MyAnnotationView -

定位 - MapKit - 基本使用

/** *  Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named MKMapView' * *  @ 如果storyboard中用到了地图,  需要导入MapKit框架 */ #import "ViewController.h" #import <MapKit/MapKit.h>

MapKit 添加大头针

#import "ViewController.h" #import <MapKit/MapKit.h> #import "MYAnnotation.h" @interface ViewController ()<MKMapViewDelegate> @property(nonatomic,strong)CLLocationManager *mag; @property(nonatomic,strong)CLGeocoder *ceocode