MapKit教程:如何在Swift中将地图添加到iOS应用程序

将地图添加到iOS应用程序是一个广泛传播的功能。地图使移动应用更具互动性,并极大地改善了用户体验。在这个MapKit教程中,我们描述了使用MapKit的经验,以帮助您学习如何在Swift中将地图添加到您的iOS应用程序

1.简介

您是否曾想在手机应用程序中构建地图?这项任务似乎太难了吗?如果是这样,那么这篇文章适合你。今天,我们将讨论MapKit。

那么,MapKit究竟是什么?它是一个基于Apple Maps的数据和API构建的有用框架,可帮助iOS开发人员在iPhone应用程序中轻松显示地图。

我们需要注意的MapKit最重要的特性是MKMapView类 - UIView的子类。此类具有所需的所有功能,例如地图,卫星甚至当前位置。可以在屏幕上使用手势来改变地理区域。真是太棒了吧?!但这还不是全部。

我们还可以在地图上添加注释照片标题和标记特定位置。另一个好处是我们可以通过MKMapViewDelegate协议接收通知,例如更改用户的当前位置或地图的区域。今天,我们将学习如何做到这一点。现在,让我们开始使用这个广泛的MapKit教程。

2.权限和当前位置

通常,我们会为您准备一个入门项目。但是谈论它并不多,所以我们实际上会从头到尾编写代码。希望这将是读者追随的另一个激励因素。

第1步:将Map Kit视图从库拖到屏幕。

通过使用Interface Builder,将Map Kit View对象拖到故事板上。为简单起见,您可以将其固定在屏幕的边缘(或安全区域(如果您参考此处))(当然,通过使用自动布局约束)。

第2步:在View Controller中创建一个管理MapKitView的IBOutlet

接下来我们需要做的是将IBOutlet连接从屏幕上的Map Kit视图拖到UIViewController。不要忘记导入MapKit库,以便代码成功编译。

BOOM,它看起来很棒,对吧?MapKit为我们提供了地图,现在我们需要做的就是观察和处理不同的事件,例如更改当前位置或地区等。

然而,在完成所有这些之前,我们首先需要做一件重要的事情:我们必须获得访问用户位置的权限。当然,如果你不这样做,你的应用程序仍然有效,地图仍然正常显示。但您必须这样做,因为位置信息是属于用户的私人信息之一。我们必须在获得之前询问他们的权限。如果您未能首先获得权限,则可能会导致应用程序崩溃。

Info.plist文件中,我们添加了一个像这样的新项:

在描述部分中,您必须向用户解释您需要其权限的原因。我们的“用于你的目的”(让我们试着说一些说服他们接受的东西)。

第3步:检查位置服务。

首先,我们将创建一个名为locationManager的变量

let locationManager = CLLocationManager() 

然后,在viewDidLoad()中,我们有:

if CLLocationManager.locationServicesEnabled(){ //继续在这里实施 } else { //做一些让用户知道为什么需要打开它的东西。 } 

locationServicesEnabled功能用于检查用户是否已接通他们的位置服务或不(在所示设置在iPhone)。如果有,我们可以继续实施我们的代码。否则,我们需要做一些事情让用户知道他们为什么需要打开它(比如发送弹出窗口来通知用户)。

第4步:检查位置授权状态

为此,我们将创建一个函数,例如:

func checkAuthorizationStatus(){ switch CLLocationManager.authorizationStatus(){ 
case.authorizedWhenInUse:break 
case.denied:break 
case .notDetermined:break 
case .restricted:break 
case.authorizedAlways:break
     }
 } 

我们创建了一个名为checkAuthorizationStatus()的函数,基本上它将检查授权状态是什么。我们需要处理五种情况:

  • authorizedWhenInUse:应用程序被授权获取用户位置的唯一时间是应用程序打开时。
  • authorizedAlways:这意味着应用程序可以随时在后台获取您的位置。这是地图应用程序,这个应用程序总是需要你的位置,当你在某个地方获得方向或你走动。
  • notDetermined:第一次弹出显示时,他们没有选择允许或不允许,所以这取决于你需要相应处理的项目。

对于剩下的两个案例,您需要根据具体情况向用户发送通知,例如用户未授予显示其位置的权限。在本文中,我们不会关注这些情况,但是,当您处理实际项目时,您还需要处理这些情况。它们和前两个一样重要

在本文中,出于教育目的,我们只处理第一种情况(authorizedWhenInUse)。所以,继续 - 我们将编写这行Swift代码:

mapView.showsUserLocation = true

此代码将显示用户的当前位置。总之,所有代码行如下所示:</pre>

override func viewDidLoad(){ 
super.viewDidLoad() 
checkLocationServices() 
} 
func checkLocationServices(){
 if CLLocationManager.locationServicesEnabled(){ checkLocationAuthorization()
 } else { 
//显示警告,让用户知道他们必须打开它。
 }} 
func checkLocationAuthorization(){ 
switch CLLocationManager.authorizationStatus(){ 
case.authorizedWhenInUse: 
mapView.showsUserLocation = true 
case .denied://显示警告告诉用户如何打开权限 break case .notDetermined: locationManager.requestWhenInUseAuthorization() 
mapView.showsUserLocation = true 
case .restricted://显示警告,让他们知道发生了什么 break case.authorizedAlways: break
 }
 }

现在,让我们构建并再次运行Xcode项目。BOOM,它显示了当前的位置。请记住,您可以模拟iOS模拟器中的任何位置。

所以,你现在怎么想?这真的很酷,对吧?!只需少量代码就可以获得很多功能。但是,这甚至都不是全部。在下一节中,我们将向您展示MapKit的一个有趣功能,我们相信您会非常喜欢它。那是在地图上显示任意位置列表。完全理解MapKit教程后,您将能够构建自己的Store Locator应用程序。

3.在地图上显示地点列表

让我们构建一个功能,在地图上显示体育场列表。以下是我们如何在Swift中快速实现这一目标。

第1步:创建Model对象

让我们为体育场创建一个模型对象。

struct Stadium { 
var name:String 
var lattitude:CLLocationDegrees 
var longtitude:CLLocationDegrees 
}

接下来,让我们在viewDidLoad()中创建一个英格兰体育场的硬编码列表。这些是我们想要在地图上绘制的体育场:
</pre>

let stadiums = [Stadium(name: “Emirates Stadium”, lattitude: 51.5549, longtitude: -0.108436),
Stadium(name: “Stamford Bridge”, lattitude: 51.4816, longtitude: -0.191034),
Stadium(name: “White Hart Lane”, lattitude: 51.6033, longtitude: -0.065684),
Stadium(name: “Olympic Stadium”, lattitude: 51.5383, longtitude: -0.016587),
Stadium(name: “Old Trafford”, lattitude: 53.4631, longtitude: -2.29139),
Stadium(name: “Anfield”, lattitude: 53.4308, longtitude: -2.96096)]

第2步:将体育场添加到地图中。

这在Swift中非常容易。MapKit可以在地图上添加地点,例如微风:

func fetchStadiumsOnMap(_ stadiums: [Stadium]) {
  for stadium in stadiums {
    let annotations = MKPointAnnotation()
    annotations.title = stadium.name
    annotations.coordinate = CLLocationCoordinate2D(latitude: 
      stadium.lattitude, longitude: stadium.longtitude)
    mapView.addAnnotation(annotations)
  }
}

它看起来很简单,对吧?对于列表中的每个体育场,我们创建了一个MKPointAnnotation实例。该MKPointAnnotation类可以帮助我们创建绑在地图上指定点的对象。接下来,我们将体育场的名称和坐标分配给该对象。之后,我们将其添加到地图视图中

完成所有操作后,我们在viewDidLoad中调用此函数,其中包含已创建的体育场列表。让我们运行并构建Xcode项目:

override func viewDidLoad() {
  super.viewDidLoad()
  checkLocationServices()
  fetchStadiumsOnMap(stadiums)
}

作为旁注,例如,如果您的地方离英格兰很远,则无法在手机上看到这些地方。因此,您需要放大地图,然后滑到英格兰。然后你会看到像这样的精确点:

4.总结

本文基本上指导您如何创建地图,询问用户访问其位置的权限,并使用MKMapView显示当前的地理位置。它还向您展示了如何在地图上提取地点列表。

我们希望通过本文,您现在有信心创建一个简单的地图,并将更多功能集成到您的移动应用程序中。我们希望你会喜欢这篇文章。这是完整的Swift源代码。请分享这篇文章,以帮助我们通过这个非常棒的MapKit教程吸引更多开发人员。快乐的编码!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容