#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];

*/

}

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

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

    有关MapView的显示和定位在上一节已经说明,这一节说明如何在地图上放置大头针,以及设置点击大头针的视图. [系统默认大头针] mapView上放置大头针的方法是调用其addAnnotation:方 ...

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

    一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...

  3. iOS地图多个自定义大头针绘制核心代码

    首先需要自定义一个包含经纬度,title,subtitle的数据模型 #import <Foundation/Foundation.h> #import <MapKit/MapKit ...

  4. 百度地图jsapi 自定义大头针的方法

    百度地图jsapi 自定义大头针的方法<pre> var myIcon = new BMap.Icon("http://developer.baidu.com/map/jsdem ...

  5. MapKit 添加大头针

    #import "ViewController.h" #import <MapKit/MapKit.h> #import "MYAnnotation.h&qu ...

  6. 定位 - MapKit - 基本使用

    /** *  Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Co ...

  7. iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)

    大致花了一个月时间,利用各种空闲时间,将这个客户端实现了,在这里主要是想记录下,设计的大体思路以及实现过程中遇到的坑...... 这个项目的github地址:https://github.com/wz ...

  8. 【iOS】7.4 定位服务->3.1 地图框架MapKit 功能1:地图展示

    > 本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. --- > 本文相关目录: ================== 所属文集:[[ ...

  9. iOS- 用MapKit和CoreLocation 来实现移动设备(地图与定位)

    1.前言 发现在很多的社交软件都引入了地图和定位功能,如果我们要想实现这两大功能,需要利用到两个框架:MapKit和CoreLocation   我们先来看看CoreLocation框架:   它可以 ...

随机推荐

  1. java查询手机号码归属地

    package com; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe ...

  2. sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法

    sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 #include <stdio.h> #include <stdlib.h> #inclu ...

  3. 解决DataTable中的DataColumn类型默认为int类型时, 导致不能修改其列值为其他类型的解决办法

    问题起因: 扔给数据库一条select * from [表名] , 得到一个DataTable, 发现有一列status状态的DataColumn的类型是int,然后我想换成字典表里的文字描述,然后就 ...

  4. POJ3974 Palindrome

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. asp.net Ajax Post 请求一般处理程序

    其实很早就开通博客园了,一直想写些有价值的东西,供自己以后查阅的同时,也可以帮助别人遇到此类问题时能有一个好的解决方法.但是由于各种原因, 就没有实施我的想法.今天突然很想写下一篇文章,不知道我的第一 ...

  6. DevExpres表格控件运行时动态设置表格列

    本文是系列文章,陆续发表于电脑编程技巧与维护杂志. DevExpres产品是全球享有极高声誉的一流控件套包产品!国内典型用户包括:用友.金蝶.神州数码.工信部.中国石化.汉王科技等众多大中型科技型企业 ...

  7. Git 常用配置和使用

    Git:是一个分布式的源代码管理工具,Linux内核的代码就是用Git管理的所以它很强,也很快, 和 Vss/SVN比起来 本地Git初始化配置及其使用: 1. 初始化本地Git库:打开Git Bas ...

  8. JS中(function(){xxx})(); 这种写法是什么意思?

    自执行匿名函数: 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命 ...

  9. 常用JS正则表达式收集

    1.去掉字符串前后空格,不会修改原有字符串,返回新串.str.replace(/(^\s*)|(\s*$)/g,'');

  10. 设置表格边框css样式

    table{ width:70%; text-align:center; border-left:#C8B9AE solid 1px; border-top:#C8B9AE solid 1px; bo ...