SwiftUI之深入解析如何使用新地图框架MapKit

一、前言

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

在这里插入图片描述

  • 会有警告提示:init coordinate region 已在 iOS 17 中弃用。请改用带有 MapContentBuilder 参数的地图初始化器。在 iOS 17 中,MapKit 为 SwiftUI 引入了需要 MapContentBuilder 参数的地图初始化器。
  • 了解 iOS 17 中的 MapKit 后,可以发现 Apple 引入了更适合 SwiftUI 的 API。

二、MapContentBuilder(iOS 17)

  • 在 iOS 17 中,用于地图视图的各种初始化器都需要一个名为 MapContentBuilder 的 content 参数。MapContentBuilder 是一个结果构建器,允许在闭包中添加地图内容,例如标记、注释和自定义内容。
  • 那么如何使用呢?如下是一些伦敦地标的坐标:
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)
}
  • 要创建一个带有标记和注释的地图视图,详细代码如下:
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)}}}
}
  • 在没有其他选项的情况下,地图视图的边界将包围地图内容。

三、地图交互

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

四、地图样式

  • 使用 Map Style 视图修饰符可以在标准、卫星或混合样式之间切换,控制高度、显示兴趣点和显示交通情况,代码如下:
Map { ...
}
.mapStyle(.hybrid(elevation: .realistic,pointsOfInterest: .including([.publicTransport]), showsTraffic: true))

五、地图控件

  • 标准的地图控件,如指南针、用户位置、倾斜、比例尺和缩放控件都实现为 SwiftUI 视图。这意味着可以将它们放置在视图的任何位置,不过需要定义一个地图范围命名空间,以将它们与它们控制的地图关联起来,代码如下:
struct ContentView: View {@Namespace var mapScopevar body: some View {VStack {Map(scope: mapScope) { ... }MapCompass(scope: mapScope)}.mapScope(mapScope)}
}
  • 要将它们放置在标准位置,使用地图控件视图修饰符,代码如下:
Map { ...
}
.mapControls {MapPitchToggle()MapUserLocationButton()MapCompass()
}

六、地图相机位置

  • 地图相机位置定义了从地图表面上方查看地图的虚拟位置,可以使用现有的地图项、地图边界、区域或用户位置来创建地图相机位置并设置初始地图位置,代码如下:
Map(initialPosition: position)
  • 将 MapCameraPosition 的绑定传递给地图,使其在用户在地图上移动时跟踪相机位置,代码如下:
struct ContentView: View {@State private var position: MapCameraPosition = .region(.uk)var body: some View {Map(position: $position) {Marker("Tower Bridge", coordinate: .towerBridge)}}
}
  • 设置位置会导致地图更改其相机位置以匹配。例如,在用户移动位置后,要在 toolbar 中添加一个按钮,以将地图重置为初始位置,代码如下:
Map(position: $position) { ...
}
.toolbar {ToolbarItem {Button("重置") {position = .region(.uk)}}
}
  • 将位置设置为 .automatic 可以使地图框架内容。

七、总结

  • 通过引入 MapContentBuilder 和其他新的初始化器,可以更方便地创建交互式地图视图,添加标记、注释和自定义内容,并在用户移动地图相机时自动更新位置。
  • 此外,还可以使用 Map Style 修饰符和 Map 控件来自定义地图的样式和控件,这些改进使得在 SwiftUI 中使用 MapKit 变得更加强大和灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/230901.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet中常用的三大API

HttpServlet 我们写 Servlet 代码的时候,首先第一步就是先创建类,继承自 HttpServlet,并重写其中的某些方法。我们实际开发的时候主要重写 doXXX 方法,很少会重写 init / destory / service。 因为这一些方法的调用时机&#xf…

电源板设计方案怎么写 (评审文件)

1. 首先是大致的图形模块化说明。 1. 大致的框图 2. 统计项目需要的功率和需求 此表格数据是假的,只是为了展示 电源种类是: 板子需要供电需要的电压和对应电压最大的电流。 电源时序是: 板子…

使用STM32和ESP8266构建智能家居网络

本文将介绍如何使用STM32微控制器和ESP8266 WiFi模块构建一个智能家居网络。我们将讨论智能家居网络的整体设计思路、硬件连接和软件开发。通过本文的指导和示例代码,读者将能够搭建一个智能家居系统,实现远程控制和数据监测。 一、智能家居网络的整体设…

Azure Machine Learning - 人脸识别任务概述与技术实战

Azure AI 人脸服务提供了可检测、识别和分析图像中的人脸的 AI 算法。 人脸识别软件在许多不同情形中都十分重要,例如识别、无接触访问控制和实现隐私的人脸模糊。你可以通过客户端库 SDK,或者直接调用 REST API 使用人脸服务。 目录 一、人脸识别服务场…

微信小程序开发系列-09自定义组件样式特性

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

【学习笔记】1、数字逻辑概论

1.1 数字信号 数字信号,在时间和数值上均是离散的。数字信号的表达方式:二值数字逻辑和逻辑电平描述的数字波形。 (1) 数字波形的两种类型 数值信号又称为“二值信号”。数字波形又称为“二值位形图”。 什么是一拍 一定的时…

如何借助于AI自研一款换脸app

文章目录 背景涉及的关键技术解析技术流程详解后续待补充 背景 在当今的数字时代,人工智能(AI)技术已经深入到各个领域,其中之一就是换脸技术。现在,有一个免费的AI换脸应用程序,可以让用户轻松地将自己的…

openssl 命令详解

openssl genrsa 命令产生私钥 openssl genrsa 命令是会用来生成 RSA 私有秘钥,不会生成公钥,因为公钥提取自私钥。生成时是可以指定私钥长度和密码保护。 如果需要查看公钥或生成公钥,可以使用 openssl rsa 命令。 命令语法: ope…

Android 11.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在11.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

【Unity入门】UGUI之Slider(滑动条)

目录 一、什么是Slider?二、Slider属性与功能 一、什么是Slider? Slider控件允许用户可以通过鼠标来在预先确定的范围调节数值 我们可以在Hierarchy视图右键 -> UI ->Slider来创建滑动条 通过上图可以发现Unity内置的Slider主要有3部分&#x…

Leetcode 62 不同路径

题意理解: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” ) 要求:机器人只能…

循环与基础函数

循环与函数 1.循环的三种方式2.循环的中断与空语句3.函数的定义与使用4.参数的作用域5.指针6.总结 1.循环的三种方式 我们最熟悉的循环为for和while,这两种循环方式在Python系列介绍过。在C中,循环的基本逻辑同Python是类似的。c中while循环的语法如下&…

亚信安慧AntDB携核心业务系统数据库升级改造方案亮相“2023年国有企业应用场景发布会”

近日,亚信安慧AntDB数据库携核心业务系统数据库升级改造方案亮相“2023年国有企业应用场景发布会”。本次国有企业应用场景发布会由北京市国资委主办、中关村发展集团承办、中关村软件园公司协办,以“融通创新 智引未来”为主题,聚焦智慧城市…

visual studio 2022在查找和替换使用正则表达式查找if()

文件内容如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {internal class Program{static void Main(string[] args){TempFunction();}private static void T…

当hashCode相同时,equals是否也相同?

目录 hashCode方法 equals方法 String类的hashCode和equals 用String为例 当hashCode相同时 总结 在Java中,理解对象的这两个基本方法—hashCode和equals对于编码是至关重要的,尤其是在处理集合类如HashMap和HashSet时。然而,一个常见的…

2023 北京国炬软件年度总结—JeecgBoot与敲敲云

2023年对于北京国炬软件公司来说是一个充满成就和创新的一年。 我们成功推出了APass零代码平台—敲敲云,一款能够在5分钟内搭建应用的新一代零代码平台。自2023年1月1号正式上线以来,敲敲云已经突破了10万注册用户,并与数百家战略合作伙伴达…

基于综合特征的细菌噬菌体宿主预测工具iPHoP (Integrated Phage HOst Prediction)的介绍以及使用方法详细流程

介绍 iPHoP(Integrated Phage HOst Prediction)是一种基于综合特征的细菌噬菌体宿主预测方法。它是通过整合基因组序列、蛋白质序列和宿主基因组信息来预测细菌噬菌体的宿主范围。 iPHoP的预测过程分为三个步骤:特征提取、特征选择和宿主预…

使用Go语言实现RESTful API

RESTful架构是一种设计风格,用于构建网络应用程序的API。它基于HTTP协议,并使用不同的HTTP方法(如GET、POST、PUT、DELETE等)来处理不同的操作。在Go语言中,我们可以使用标准库中的net/http包来实现RESTful API。 下面…

人工智能_机器学习089_DBSCAN聚类案例_DBSCAN聚类算法效果展示_使用轮廓系数来评分DBSCAN效果---人工智能工作笔记0129

dbscan = DBSCAN(eps = 0.2,min_samples =3) 我们指定半径是0.2 然后每个圆圈至少是3个数据就可以归为一类 dbscan.fit(X) 然后进行训练 # 得到每个样本的标签,分类结果 y_ =dbscan.labels_ 然后得到结果 ,注意这里不需要进行predict,因为fit直接就相当于分类了 plt.scatte…

前端跨域问题的解决思路

目录 前言 跨域问题的解决思路 一般跨域的解决方案 前言 做了一个简单页面,做了一些数据埋点,想通过企业微信机器人来推送数据,遇到了一些问题,顺便记录下。 跨域问题的解决思路 由于是项目比较简单,直接使用了aj…