前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何使用 SwiftUI 中新地图框架 MapKit

如何使用 SwiftUI 中新地图框架 MapKit

作者头像
Swift社区
发布于 2023-09-06 04:48:40
发布于 2023-09-06 04:48:40
73600
代码可运行
举报
文章被收录于专栏:Swift社区Swift社区
运行总次数:0
代码可运行

前言

了解 iOS 17 中的 MapKit 后,我们会发现 Apple 引入了更适合 SwiftUI 的 API

MapKit 弃用项

一旦将你的 App 目标更新到 iOS 17,Xcode 会将任何使用旧的 Map 初始化器的用法标记为已弃用:

会有警告提示:init coordinate region 已在 iOS 17 中弃用。请改用带有 MapContentBuilder 参数的地图初始化器。

在 iOS 17 中,MapKit 为 SwiftUI 引入了需要 MapContentBuilder 参数的地图初始化器。下面为大家介绍一下MapKit 相关的基础知识。

MapContentBuilder(iOS 17)

在 iOS 17 中,用于地图视图的各种初始化器都需要一个名为 MapContentBuilder 的 content 参数。MapContentBuilder 是一个结果构建器,允许在闭包中添加地图内容,例如标记、注释和自定义内容。

下面让我们看看是如何使用的,这里是一些伦敦地标的坐标:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extension CLLocationCoordinate2D {
  static let towerBridge = CLLocationCoordinate2D(latitude: 51.5055, longitude: -0.075406)
  static let boe = CLLocationCoordinate2D(latitude: 51.5142, longitude: -0.0885)
  static let hydepark = CLLocationCoordinate2D(latitude: 51.508611, longitude: -0.163611)
  static let kingsCross = CLLocationCoordinate2D(latitude: 51.5309, longitude: -0.1233)
}

要创建一个带有标记和注释的地图视图,详细代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ContentView: View {
  var body: some View {
    Map {
      Marker("Tower Bridge", coordinate: .towerBridge)
      Marker("Hyde Park", coordinate: .hydepark)
      Marker("Bank of England", 
        systemImage: "sterlingsign", coordinate: .boe)
        .tint(.green)
    
      Annotation("Kings Cross", 
        coordinate: .kingsCross, anchor: .bottom) {
          VStack {
              Text("在此搭乘火车!")
              Image(systemName: "train.side.front.car")
          }
          .foregroundColor(.blue)
          .padding()
          .background(in: .capsule)
      }
    }
  }
}

在没有其他选项的情况下,地图视图的边界将包围地图内容。

地图交互

为了控制用户与地图的交互方式,可以传递一组允许的模式。默认情况下允许所有模式(平移、缩放、倾斜、旋转),代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map(interactionModes: [.pan,.pitch]) { ... }

地图样式

使用 Map Style 视图修饰符可以在标准、卫星或混合样式之间切换,控制高度、显示兴趣点和显示交通情况,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map { ...
}
.mapStyle(.hybrid(elevation: .realistic,
  pointsOfInterest: .including([.publicTransport]), 
  showsTraffic: true))

地图控件

标准的地图控件,如指南针、用户位置、倾斜、比例尺和缩放控件都实现为 SwiftUI 视图。这意味着可以将它们放置在视图的任何位置,不过需要定义一个地图范围命名空间,以将它们与它们控制的地图关联起来,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ContentView: View {
  @Namespace var mapScope

  var body: some View {
    VStack {
      Map(scope: mapScope) { ... }
      MapCompass(scope: mapScope)
    }
    .mapScope(mapScope)
  }
}

要将它们放置在标准位置,使用地图控件视图修饰符,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map { ...
}
.mapControls {
  MapPitchToggle()
  MapUserLocationButton()
  MapCompass()
}

地图相机位置

地图相机位置定义了从地图表面上方查看地图的虚拟位置。可以使用现有的地图项、地图边界、区域或用户位置来创建地图相机位置并设置初始地图位置,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map(initialPosition: position)

MapCameraPosition 的绑定传递给地图,使其在用户在地图上移动时跟踪相机位置,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ContentView: View {
  @State private var position: MapCameraPosition = .region(.uk)

  var body: some View {
    Map(position: $position) {
      Marker("Tower Bridge", coordinate: .towerBridge)
    }
  }
}

设置位置会导致地图更改其相机位置以匹配。例如,在用户移动位置后,要在 toolbar 中添加一个按钮,以将地图重置为初始位置,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map(position: $position) { ...
}
.toolbar {
  ToolbarItem {
    Button("重置") {
      position = .region(.uk)
    }
  }
}

将位置设置为 .automatic 可以使地图框架内容。

总结

这就是在 iOS 17 中使用 SwiftUI 中的 MapKit 所需要了解的内容。通过引入 MapContentBuilder 和其他新的初始化器,可以更方便地创建交互式地图视图,添加标记、注释和自定义内容,并在用户移动地图相机时自动更新位置。

此外,还可以使用 Map Style 修饰符和 Map 控件来自定义地图的样式和控件。这些改进使得在 SwiftUI 中使用 MapKit 变得更加强大和灵活。

- EOF -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Swift社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据库的大日志文件处理技巧
在做数据库维护的时候,经常需要使用数据库日志来排查问题,有时候会遇到日志文件比较大,例如一个历史MySQL的slowlog上TB了,或者MongoDB的log上大几百G,通常这种情况下,我们有下面几个方法来处理日志。
AsiaYe
2022/05/17
1.2K0
Linux进阶命令-sed&split
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2024/11/01
770
Linux进阶命令-sed&split
TiDB Lightning导入超大型txt文件实践
TiDB 提供了很多种数据迁移的方式,但这些工具/方案普遍对MySQL比较友好,一旦涉及到异构数据迁移,就不得不另寻出路,借助各种开源或商业的数据同步工具。其实数据在不同系统的流转当中,有一种格式是比较通用的,那就是txt/csv这类文件,把数据用约定好的分隔符换行符等标记存放在一起,比如最常见的逗号分隔:
HOHO
2022/10/31
1.3K0
TiDB Lightning导入超大型txt文件实践
使用gitbook快速搭建文档中心
在研发一个系统,主要给公司内部同事用,按理说,简单点的话,搞个使用文档就行了,但产品经理希望是做成一个文档中心,比如,你学习个新技术的时候,比如vue,一般有个在线的帮助文档,他的想法就是这种。
低级知识传播者
2023/10/25
3.1K0
使用gitbook快速搭建文档中心
【CSP-S】2023年信息学CSP-S之Linux知识点:目录操作和文件操作
孩子们平时很少使用Linux,所以这篇文章让孩子看2~3遍,大概有个印象,这部分分基本就能拿到。
小码匠
2023/08/31
1.5K0
【CSP-S】2023年信息学CSP-S之Linux知识点:目录操作和文件操作
linux基础命令介绍二:输入与输出
在第一篇介绍命令行接口时,我们是这样描述CLI的:是一种通过在终端窗口中键入文本命令来实现与计算机交互的接口。 这里简要说明一下终端的概念,历史上,控制台与终端都是硬件。其中控制台(console)是计算机本身就有的设备,一台计算机只有一个控制台。计算机启动的时候,所有的信息都会显示到控制台上。而终端(terminal)属于外围设备(显示器和键盘),通常通过串口与计算机相连,然后对计算机进行操作。计算机操作系统中,与终端不相关的信息,比如内核消息,后台服务消息,不会显示到终端上。由于控制台与终端都起着显示信息的作用,于是随着时间的推移,它们之间的区别也越来越模糊。现在,计算机硬件越来越便宜,通常不再连接以前那种真正意义上的“终端设备”了,终端和控制台由硬件的概念,逐渐演化成了软件的概念。当前所说的终端,比如linux中的虚拟终端,都是软件的概念。 如上一篇中提到的命令who的输出:
用户5030870
2019/04/11
3.9K0
linux基础命令介绍二:输入与输出
文件系统中的目录与切换操作
另外,cd - 为进入上一次的工作目录,如同 git checout - 切回上次的分支一样。
闻说社
2022/06/24
1.3K0
文件系统中的目录与切换操作
linux 命令
1.sha1 shasum *.* 2.md5 md5 *.* 3.查看目录下文件个数 ls -l |grep "^-"|wc -l ll -rt //按时间降序 | tac 是升序 4.查看当前所有目录大小 du -sh * 5.把文件夹下的某些文件名导入到txt中 find . -type f -name "*.xml" > test.txt 6.压缩包分卷 tar -jcf - xxx.tar | split -b 1400k - xxx.tar.bz2. cat xxx.tar.
全栈程序员站长
2021/04/07
5.3K0
GitHub-创建仓库与本地同步
1. 在Linux上安装Git 1 [root@mini05 ~]# yum install -y git 2 ……………… 2. 本地创建ssh-key信息 1 [root@mini05 ~]# ssh-keygen -t rsa 2 Generating public/private rsa key pair. 3 Enter file in which to save the key (/root/.ssh/id_rsa): 4 Created directory '/root/.ssh'.
踏歌行
2020/10/15
6470
GitHub-创建仓库与本地同步
liunx常用命令
待查看的目录:非必填的选项,一般情况下都是看当前目录,可省去;非当前目录时,需要指定要查看的目录。 参数:包含是否包含隐藏文件,是否显示文件的权限、大小、修改时间等,常用的有 -a表示包含隐藏文件 -lh表示查看文件的权限、修改时间、大小
努力在北京混出人样
2022/09/23
9690
git仓库的简单使用
git是分布式的仓库,我们不需要把代码上传或更新到某个特定的服务器上,所以它不需要依赖网络,我们可以在本地创建一个git仓库。
端碗吹水
2020/09/23
5600
git仓库的简单使用
sqoop的安装与使用
Sqoop即 SQL to Hadoop ,是一款方便的在传统型数据库与Hadoop之间进行数据迁移的工具。充分利用MapReduce并行特点以批处理的方式加快传输数据。发展至今主要演化了二大版本号。Sqoop1和Sqoop2。
全栈程序员站长
2022/07/10
7970
sqoop的安装与使用
怎么办,linux的常用命令就是记不住?于是每天推一些linux指令实践总结
前言 Linux可以说是前后端开发者必备的技能,那么阿沐本身大学主修Linux操作系统+嵌入式,虽然毕业之后并没与从事与操作系统方面开发;但是还是身在互联网,保持前后端开发工作,涉及到服务器部署、日志分析统计、vim编辑等等。linux的基础命令可以说我们必须掌握的,不然有的面试我们都过不了。所以万字总结linux实用的基本命令,小伙伴们收藏起来,每天必看必敲。😄 😄 😄 因为基础命令分工类别比较多,我就先来一份脑图补补: linux基础命令.png 1、help command 1.1 Bash 内
我是阿沐
2021/06/22
1.3K0
使用HBCK2工具修复HBase集群
HBCK2工具是修复工具,可用于修复Apache HBase集群,包括CDP中的Apache HBase集群。HBCK2工具是Apache HBase hbck工具的下一版本。
大数据杂货铺
2021/02/07
3.3K0
docker(常用软件安装)
我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器外部修改文件名,容器内部就可以自动修改?-v 数据卷 技术!
崔笑颜
2020/10/27
9670
docker(常用软件安装)
Linux系统之使用split切割日志文件
小胡同学的文章详尽解析了2022年山东省技能大赛的样题,从IP地址规划到设备初始化信息,再到具体任务的实施步骤,内容丰富且实用。特别是在网络平台搭建和网络安全设备配置与防护方面,提供了非常详细的指导,如Telnet登录的授权信息设置、SNMPv3的安全配置以及VLAN的安全机制等,对于参赛者来说是不可多得的学习资料。文章结构清晰,逻辑性强,适合初学者和参赛选手参考学习。
江湖有缘
2024/11/12
2270
Linux系统之使用split切割日志文件
我把云服务器,搭建成开发环境使用!—— 小伙伴开发项目,构建项目,更容易啦。
在几年前刚入手 Mac 电脑的时候,有不少伙伴问过我,这电脑有什么优势吗?又不能打游戏!是呀,能想到的就是没有广告、APP安装简单、UI风格细腻。但这些和 Windows 电脑好像也没有太大的差别,各有所好罢了。而且同等配置 Mac 还要贵不少。
小傅哥
2024/04/10
4420
我把云服务器,搭建成开发环境使用!—— 小伙伴开发项目,构建项目,更容易啦。
Elastic Stack之 Filebeat 6.7.1版本安装
1、截至目前Elasticsearch 版本已经更新到了7.10.1版本了,这里先使用Filebeat 6.7.1版本,给一个下载地址,如下所示:
别先生
2021/01/13
9300
gitlab-ci的简易入门—基于python项目的CI演示
使用github上开源的一个python的demo项目,地址为:https://github.com/imooc-course/docker-cloud-flask-demo 打开自己的gitlab,点击New project,把项目导入。
没有故事的陈师傅
2020/07/01
3.8K0
gitlab-ci的简易入门—基于python项目的CI演示
Delta Lake 学习笔记(一)
今天 Spark + AI Summit 2019 宣布开源了 Delta Lake 这个项目,关于这个项目的背景我就不赘述了,砖厂官网有很多介绍,包括项目的 Github 地址,大家可以上去看看,我也打算测一下,并且研究一下源代码,所以今天开始写一些探索这个项目的学习笔记。
runzhliu
2020/08/05
1.1K0
相关推荐
数据库的大日志文件处理技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文