使用MapKit框架(持续更新)

使用MapKit框架

地图显示

最简单显示地图的代码:

//
// RootViewController.m
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import <MapKit/MapKit.h>

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// 初始化地图控件
MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];

// 地图的类型
mapView.mapType = MKMapTypeStandard;

// 视图的宽度和高度将和父视图的宽度一起成比例变化
mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

// 显示地图
[self.view addSubview:mapView];
}

@end

RootViewController

注意:使用地图之前是需要引入MapKit框架的哦.

autoresizingMask是干什么用的呢(实际上,我看过后还是不懂)?























UIViewAutoresizingNone

这个常量如果被设置,视图将不进行自动尺寸调整。

UIViewAutoresizingFlexibleHeight

这个常量如果被设置,视图的高度将和父视图的高度一起成比例变化。否则,视图的高度将保持不变。

UIViewAutoresizingFlexibleWidth

这个常量如果被设置,视图的宽度将和父视图的宽度一起成比例变化。否则,视图的宽度将保持不变。

UIViewAutoresizingFlexibleLeftMargin

这个常量如果被设置,视图的左边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的左边界的相对位置将保持不变。

UIViewAutoresizingFlexibleRightMargin

这个常量如果被设置,视图的右边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的右边界的相对位置将保持不变。

UIViewAutoresizingFlexibleBottomMargin

这个常量如果被设置,视图的底边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的底边界的相对位置将保持不变。

UIViewAutoresizingFlexibleTopMargin

这个常量如果被设置,视图的上边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的上边界的相对位置将保持不变。

//
// RootViewController.m
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import <MapKit/MapKit.h>

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// 初始化地图控件
MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];

// 地图的类型
mapView.mapType = MKMapTypeStandard;

// 视图的宽度和高度将和父视图的宽度一起成比例变化
mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

// 显示用户所在位置(此处系统会询问你是否使用当前位置)
mapView.showsUserLocation = YES;

// 经纬度坐标(河南南阳)
CLLocationCoordinate2D coor2d = {33.00, 112.52};

// 地图缩放级别
MKCoordinateSpan span = {5, 5};

// 被显示的区域
MKCoordinateRegion region = {coor2d, span};

// 设置显示的区域
[mapView setRegion:region];

// 显示地图
[self.view addSubview:mapView];

}

@end

RootViewController.m

位置定位

//
// RootViewController.m
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import <MapKit/MapKit.h>

@interface RootViewController ()<CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;

@end

@implementation RootViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// 判断定位功能是否可以使用
if([CLLocationManager locationServicesEnabled])
{
// 初始化定位管理器
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;

// 开始定位
[_locationManager startUpdatingLocation];
}
else
{
NSLog(@"定位功能不可用");
}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *newLocation = [locations lastObject];
NSLog(@"%@", newLocation);

// 定位结束
[manager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
NSLog(@"%@", error);

// 定位结束
[manager stopUpdatingLocation];
}

@end

RootViewController.m

为什么需要判断定位功能可不可用呢?下图可以看出为什么了.

打印信息:

2014-05-15 09:25:11.883 CoreLocation[17610:60b] <+37.78583400,-122.40641700>
+/- 5.00m (speed -1.00 mps / course -1.00) @ 5/15/14, 9:25:11
AM China Standard Time

本人将这个代理定位的方式改写成了可以使用block的方式:

YXLocation.h

//
// YXLocation.h
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@protocol YXLocationProtocol <NSObject>

@optional
- (void)currentLocation:(CLLocation *)location sucess:(BOOL)sucess;

@end

typedef void (^locationBlock_t)(CLLocation *currentLocation, BOOL sucess);

@interface YXLocation : NSObject

@property (nonatomic, copy, readwrite) locationBlock_t locationBlock;
@property (nonatomic, assign, readwrite) id<YXLocationProtocol> protocol;

@property (nonatomic, strong, readonly) CLLocation *location;

- (void)start;

@end

Code

YXLocation.m

//
// YXLocation.m
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "YXLocation.h"

@interface YXLocation ()<CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;

@end

@implementation YXLocation

- (instancetype)init
{
self = [super init];
if (self)
{
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
}
return self;
}

- (void)start
{
if([CLLocationManager locationServicesEnabled])
{
[_locationManager startUpdatingLocation];
}
else
{
NSLog(@"定位功能没有开启");

if (_locationBlock)
{
_locationBlock(nil, NO);
}

if (_protocol)
{
[_protocol currentLocation:nil sucess:NO];
}
}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *newLocation = [locations lastObject];

_location = newLocation;

if (_locationBlock)
{
_locationBlock(newLocation, YES);
}

if (_protocol)
{
[_protocol currentLocation:newLocation sucess:YES];
}

[_locationManager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
NSLog(@"定位功能出错");

if (_locationBlock)
{
_locationBlock(nil, NO);
}

if (_protocol)
{
[_protocol currentLocation:nil sucess:NO];
}
}

@end

Code

将经纬度转换为有意义的地址

//
// RootViewController.m
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import <MapKit/MapKit.h>

@interface RootViewController ()<CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) CLGeocoder *geocoder;

@end

@implementation RootViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// 判断定位功能是否可以使用
if([CLLocationManager locationServicesEnabled])
{
// 初始化定位管理器
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;

// 开始定位
[_locationManager startUpdatingLocation];
}
else
{
NSLog(@"定位功能不可用");
}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *newLocation = [locations lastObject];

// 初始化经纬度解析器
_geocoder = [[CLGeocoder alloc] init];

// 解析经纬度值
[_geocoder reverseGeocodeLocation:newLocation
completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];

// 将字典信息拼接起来
NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];

// 打印信息
NSLog(@"我在 %@",locatedAt);

NSLog(@"国家代码 %@",placemark.ISOcountryCode);
NSLog(@"国家 %@",placemark.country);
NSLog(@"邮政编码 %@",placemark.postalCode);
NSLog(@"administrativeArea %@",placemark.administrativeArea);
NSLog(@"locality %@",placemark.locality);
NSLog(@"subLocality %@",placemark.subLocality);
NSLog(@"subThoroughfare %@",placemark.subThoroughfare);
}];

// 定位结束
[manager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
NSLog(@"%@", error);

// 定位结束
[manager stopUpdatingLocation];
}

@end


RootViewController.m

打印信息如下:

2014-05-15 09:40:13.982 CoreLocation[2482:60b] 我在
中国北京市东城区东四街道东四朝阳门北小街2-1号
2014-05-15 09:40:13.986 CoreLocation[2482:60b]
国家代码 CN
2014-05-15 09:40:13.987 CoreLocation[2482:60b]
国家    中国
2014-05-15 09:40:13.988 CoreLocation[2482:60b]
邮政编码 (null)
2014-05-15 09:40:13.989 CoreLocation[2482:60b]
administrativeArea 北京市
2014-05-15 09:40:13.991 CoreLocation[2482:60b]
locality (null)
2014-05-15 09:40:13.992 CoreLocation[2482:60b]
subLocality 东城区
2014-05-15 09:40:13.993 CoreLocation[2482:60b]
subThoroughfare 2-1号

将有意义的地址转换为经纬度

//
// RootViewController.m
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import <MapKit/MapKit.h>

@interface RootViewController ()<CLLocationManagerDelegate>

@property (nonatomic, strong) CLGeocoder *geocoder;

@end

@implementation RootViewController

- (void)viewDidLoad
{
[super viewDidLoad];

_geocoder = [[CLGeocoder alloc] init];

[_geocoder geocodeAddressString:@"中国北京市东城区东四街道东四朝阳门北小街2-1号"
completionHandler:^(NSArray *placemarks, NSError *error)
{

if([placemarks count] > 0 && error == nil)
{

NSLog(@"发现了 %lu placemark(s).",(unsigned long)[placemarks count]);

CLPlacemark *firstPlacemark = [placemarks objectAtIndex:0];

NSLog(@"经度 = %f",firstPlacemark.location.coordinate.longitude);
NSLog(@"纬度 = %f",firstPlacemark.location.coordinate.latitude);

}
else if ([placemarks count] == 0 && error == nil)
{
NSLog(@"没有找到 placemarks.");

}
else if (error != nil)
{
NSLog(@"错误 = %@",error);
}
}];
}

@end

RootViewController.m

打印信息:

2014-05-15 09:51:15.270 CoreLocation[2525:60b] 发现了 2
placemark(s).
2014-05-15 09:51:15.274 CoreLocation[2525:60b] 经度 =
116.425960
2014-05-15 09:51:15.275 CoreLocation[2525:60b] 纬度 =
39.931609

直接显示用户当前位置

//
// RootViewController.m
// CoreLocation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import <MapKit/MapKit.h>

@interface RootViewController ()<CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;

@end

@implementation RootViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// 判断定位功能是否可以使用
if([CLLocationManager locationServicesEnabled])
{
// 初始化定位管理器
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;

// 开始定位
[_locationManager startUpdatingLocation];
}
else
{
NSLog(@"定位功能不可用");
}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// 获取坐标信息
CLLocation *newLocation = [locations lastObject];

// 定位结束
[manager stopUpdatingLocation];

// 初始化地图控件
MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];

// 地图的类型
mapView.mapType = MKMapTypeStandard;

// 视图的宽度和高度将和父视图的宽度一起成比例变化
mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

// 显示用户所在位置(此处系统会询问你是否使用当前位置)
mapView.showsUserLocation = YES;

// 地图缩放级别
MKCoordinateSpan span = {0.02, 0.02};

// 被显示的区域
MKCoordinateRegion region = {newLocation.coordinate, span};

// 设置显示的区域
[mapView setRegion:region];

// 显示地图
[self.view addSubview:mapView];
}

- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
NSLog(@"%@", error);

// 定位结束
[manager stopUpdatingLocation];
}

@end

RootViewController.m

使用MapKit框架(持续更新)

时间: 2024-10-27 13:17:38

使用MapKit框架(持续更新)的相关文章

iOS之github第三方框架(持续更新)

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

iOS开发常用第三方开源框架 持续更新中...

键盘管理TPKeyboardAvoidingIQKeyboardManager 弹窗HUDMBProgressHUDSVProgressHUDUIView+Toast UIView显示提示CategoryToast-Swift Tosat-swift版本SnailPopupController 快速弹出自定义视图,支持自定义蒙版样式/过渡效果/手势拖动等 上下拉刷新MJRefreshSVPullToRefresh JSON解析MJExtension 网络请求AFNetworkingAlamofi

自己总结的 iOS ,Mac 开源项目以及库,知识点------持续更新

自己在 git  上看到一个非常好的总结的东西,但是呢, fork  了几次,就是 fork  不到我的 git 上,干脆复制进去,但是,也是认真去每一个每一个去认真看了,并且也是补充了一些,感觉非常棒,所以好东西要分享,为啥用 CN 博客,有个好处,可以随时修改,可以持续更新,不用每次都要再发表,感觉这样棒棒的 我们 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.

iOS开发系列文章(持续更新……)

iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大家交流,新建一个iOS技术交流群,欢迎大家加入:64555322 C语言 IOS开发系列--C语言之基础知识 IOS开发系列--C语言之数组和字符串 IOS开发系列--C语言之指针 IOS开发系列--C语言之预处理 IOS开发系列--C语言之存储方式和作用域 IOS开发系列--C语言之构造类型 Ob

动态加载页面数据的小工具 javascript + jQuery (持续更新)

使用该控件,可以根据url,参数,加载html记录模板(包含json参数对应,以及具体记录位置Index根据参数描述加载对应的属性,并可以根据简单的判断分支加载对应html或者控件)至列表容器内(JQuery选择器字符串)注: 该控件在使用前需引入JQuery框架支持,使用该控件,可极大的减少Ajax列表数据动态加载开发工作的实际工作量. 使用方式: 首先,添加控件引用,并加入Jquery支持 <script src="js/jquery.js"></script&g

iOS:开发常用GitHub开源项目(持续更新)

IOS开发常用GitHub开源项目(持续更新) 数据类 开源库 作者 简介 AFNetworking Mattt 网络请求库 ASIHTTPRequest pokeb 网络请求库 Alamofire cnoon Swift简洁网络请求库 SBJson stig Json解析引擎 JSONKit johnezang Json解析引擎 MJExtension CoderMJLee 字典转模型框架 KissXML robbiehanson XML解析 RNCryptor rnapier AES加密 F

android开发开源宝贝——持续更新。。。

2016年11月11日更新 http://www.apkbus.com/forum-417-1.html http://p.codekk.com/detail/Android/hejunlin2013/LivePlayback www.codekk.com https://github.com/Trinea/android-open-project Android 开源项目分类汇总 我们的微信公众号:codekk.二维码如下: 专注于 Android 开源分享.源码解析.框架设计.Android

iOS核心笔记—MapKit框架-基础

1.MapKit框架简介: ?了解:MapKit框架使用须知:①.MapKit框架中所有的数据类型的前缀都是MK:②.需要导入#import <MapKit/MapKit.h>头文件:③.MapKit框架中有一个非常重要的UI控件:MKMapView,专门用于地图显示,例如:大头针.路线.覆盖层展示等(着重界面展示). 1-1.地图设置: 1-1-1.设置地图显示类型: 地图类型: 地图枚举 地图类型 MKMapTypeStandard 普通地图 MKMapTypeSatellite 卫星云图

干货!IT小伙伴们实用的网站及工具大集合!持续更新!

干货!IT小伙伴们实用的网站及工具大集合!持续更新! Other  崔庆才  4个月前 (12-24)  6720℃  7评论 1.Git 还在担心自己辛辛苦苦写的代码被误删了吗?还在担心自己改错了代码不能挽回吗?还在苦恼于多人开发合作找不到一个好的工具吗?那么用Git就对了,Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.有了它,代码托管不是问题,版本控制不再苦恼,多人开发变得简单易行. 链接:http://git-scm.com/ 2.GitHub 学