热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MapKit&CoreLocation基本使用以及地图大头针的添加与个性化

MRMapViewController.mCoreLocation&MapKitCreatedbyMr.Roboton201786.
//
// MRMapViewController.m
// CoreLocation&MapKit
//
// Created by Mr.Robot on 2017/8/6.
// Copyright © 2017年 Mr.Robot. All rights reserved.
//

#import "MRMapViewController.h"
#import "MyAnnotationModel.h"

#import
#import

@interface MRMapViewController () <MKMapViewDelegate>

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

@end

@implementation MRMapViewController

- (void)viewDidLoad {
[super viewDidLoad];

self.mgr = [CLLocationManager new];

if ([self.mgr respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.mgr requestAlwaysAuthorization];
}



/**
userTrackingMode几种选择,以及意义:
MKUserTrackingModeNOne= 0, // the user's location is not followed(不跟随用户地点)
MKUserTrackingModeFollow, // the map follows the user's location(跟随用户位置)
MKUserTrackingModeFollowWithHeading __TVOS_PROHIBITED, // the map follows the user's location and heading(跟随用户位置并用箭头指向用户朝向)
*/

self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
//设置代理
self.mapView.delegate = self;

/**
ios9新特性
*/

//显示交通状况
self.mapView.showsTraffic = YES;

//设置指南针(默认就是yes)
self.mapView.showsCompass = YES;

//设置比例尺
self.mapView.showsScale = YES;
}

#pragma mark - 用户点击地图即添加大头针
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint point = [[touches anyObject] locationInView:self.mapView];

CLLocationCoordinate2D coordinate = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];

MyAnnotationModel *annotatiOnModel= [MyAnnotationModel new];

annotationModel.coordinate = coordinate;
annotationModel.title = @"";
annotationModel.subTitle = @"";

[self.mapView addAnnotation:annotationModel];
}

//自定义大头针模型
#pragma mark - 只要添加了大头针模型就会调用这个方法,返回对应的View
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation
{

//如果返回nil, 就代表用户没有自定义的需求, 所有的View样式由系统处理
//MKUserLocation: 系统专门显示用户位置的大头针模型
//MyAnnotationModel: 自定义的类

//1. 如果发现是显示用户位置的大头针模型, 就返回nil
if ([annotation isKindOfClass:[MKUserLocation class]]) {
return nil;
}


//2. 自定义大头针View --> 跟Cell的创建几乎一样
static NSString *ID = @"annoView";

//MKAnnotationView : 默认image属性没有赋值
//MKPinAnnotationView : 子类是默认有View的
MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

if (annoView == nil) {
annoView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];

/**
MKPinAnnotationColorRed
MKPinAnnotationColorGreen,
MKPinAnnotationColorPurple
*/


// 设置颜色 iOS9首次过期
//annoView.pinColor = MKPinAnnotationColorGreen;

//3. 设置颜色, iOS9新增
annoView.pinTintColor = [UIColor colorWithRed:arc4random_uniform(256) / 255.0 green:arc4random_uniform(256) / 255.0 blue:arc4random_uniform(256) / 255.0 alpha:1];

//4. 设置动画掉落
annoView.animatesDrop = YES;

}

return annoView;

}

#pragma mark - 切换地图类型
- (IBAction)mapTypeChangeClick:(UISegmentedControl *)sender {

/**
MKMapType类型
typedef NS_ENUM(NSUInteger, MKMapType) {
MKMapTypeStandard = 0, 标准
MKMapTypeSatellite, 卫星
MKMapTypeHybrid, 混合模式
MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), 卫星模式flyover(flyover模式中国地区不能用)
MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), 混合模式flyover
} NS_ENUM_AVAILABLE(10_9, 3_0) __TVOS_AVAILABLE(9_2) __WATCHOS_PROHIBITED;
*/


switch (sender.selectedSegmentIndex) {
case 0:
self.mapView.mapType = MKMapTypeStandard;
break;
case 1:
self.mapView.mapType = MKMapTypeSatellite;
break;
case 2:
self.mapView.mapType = MKMapTypeHybrid;
break;
default:
break;
}

}

#pragma mark - 定位按钮
- (IBAction)locateClick:(id)sender {

//获取当前用户位置-以二维坐标表示
CLLocationCoordinate2D coordinate = self.mapView.userLocation.location.coordinate;

//获取当前显示范围
MKCoordinateSpan coordinateSpan = MKCoordinateSpanMake(self.mapView.region.span.latitudeDelta, self.mapView.region.span.longitudeDelta);
//设置显示范围及中心点地理坐标
[self.mapView setRegion:MKCoordinateRegionMake(coordinate, coordinateSpan) animated:YES];
}

#pragma mark - 调整地图大小
#pragma mark - 放大
- (IBAction)zoomInClick:(id)sender {
CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;
CGFloat lOngitudeDelta= self.mapView.region.span.longitudeDelta * 0.5;

[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, MKCoordinateSpanMake(latitudeDelta, longitudeDelta)) animated:YES];
}

#pragma mark - 缩小
- (IBAction)zoomOutClick:(id)sender {
CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 2;
CGFloat lOngitudeDelta= self.mapView.region.span.longitudeDelta * 2;

[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, MKCoordinateSpanMake(latitudeDelta, longitudeDelta)) animated:YES];
}

- (BOOL)prefersStatusBarHidden
{
return NO;
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

推荐阅读
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
author-avatar
骑猪猪-逛恋空
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有