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.mzph.cn/news/597564.shtml

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

相关文章

2023新年总结与展望

2023年总结 对Spring Cloud微服务更加熟悉,对consul、kafka、gateway的熟悉和掌握更近一步对docker和虚拟化部署更加熟悉对PostgreSQL数据库和JPA更加熟悉对clickhouse数据库和大数据分析更加熟悉对netty和socket网络通信更加熟悉 2024年flag 继续深入研究和学习…

Java-replaceAll()同时替换多个字符

今天复现了raplaceAll()的用法,但是通常都是对一种字符进行替换,我就在想有没有操作可以一次性替换多个不同的字符,百度一搜,果然有。具体情况如下 首先是替换字的 String str1 "小明,小…

案例091:基于微信小程序的农场驿站平台的设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

Redis (三)

1、redis复制 简单的概括就是主从复制,master以写为主,Slave以读为主,当master数据发生变化的时候,自动将更新的数据异步同步到其他的slave是数据库。 使用这种机制的话,可以做到读写分离,可以减轻主机负担…

[设计模式 Go实现] 行为型~迭代器模式

迭代器模式 送代器模式用于使用相同方式送代不同类型集合或者隐藏集合类型的具体实现。 可以使用送代器模式使遍历同时应用送代策略,如请求新对象、过滤、处理对象等。 iterator.go package iteratorimport "fmt"type Aggregate interface {Iterator(…

【华为数据之道学习笔记】10-3 摆脱传统手段的数据管理方式

智能数据管理是数据工作的未来 在以传统方式对数据实施管理和治理的过程中,数据工作者和业务方都需要投入相当多的人力和资源,才能达成管理目标,其中的艰辛,相信各位业内人士都深有体会。而随着智能大数据时代的到来,各…

# [NOIP2015 普及组] 扫雷游戏#洛谷

题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时&#…

14.两数之和

题目 class Solution {public int[] twoSum(int[] nums, int target) {int[] ret {-1,-1};for(int i0;i<nums.length;i) {for(int ji1;j<nums.length;j) {if(nums[i] nums[j] target) {ret[0] i;ret[1] j;}}}return ret;} }

uniapp 无限级树形结构面包屑、单选-多选、搜索、移除功能插件,基于【虚拟列表】高性能渲染海量数据,加入动态高度、缓冲区

hyq-tree-vtw 无限级树形结构面包屑、单选-多选、搜索、移除功能 示例项目 单选-user 单选-任意一项 多选-关联下级 多选-任意一项 已选择数据弹框 说明 本插件需要使用uni-popup、uni-transition用于已选择数据弹框&#xff0c;因此需要有这些依赖,请自行导入本插件基于【虚…

企业培训系统开发:构建灵活高效的学习平台

企业培训系统的开发在当今数字化时代是至关重要的。本文将介绍一些关键技术和代码示例&#xff0c;以帮助您构建一个灵活、高效的企业培训系统。 1. 技术选型 在开始企业培训系统的开发之前&#xff0c;首先需要选择合适的技术栈。以下是一个基本的技术选型示例&#xff1a;…

Python(wordcloud):根据文本数据(.txt文件)绘制词云图

一、前言 本文将介绍如何利用python来根据文本数据&#xff08;.txt文件&#xff09;绘制词云图&#xff0c;除了绘制常规形状的词云图&#xff08;比如长方形&#xff09;&#xff0c;还可以指定词云图的形状。 二、相关库的介绍 1、安装相关的库 pip install jieba pip i…

编程语言的未来:探索技术进步的轨迹

编程语言的未来&#xff1a;探索技术进步的轨迹 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。然而&#xff0c;未来的技术进步将如何影响编程语言的走向呢&#xff1f;让我…

Linux——使用KVM命令集管理虚拟机

一、KVM基本功能管理 1&#xff09;查看命令帮助 [rootlucky ~]# virsh -h2&#xff09;查看KVM的配置文件存放目录&#xff08;rhel7.1.xml是虚拟机系统实例的配置文件&#xff09; [rootlucky ~]# ls /etc/libvirt/qemu autostart networks rhel7.1.xml3&#xff09;查看…

git使用 笔记2

新建代码库 在当前目录新建一个Git代码库 $ git init 新建一个目录&#xff0c;将其初始化为Git代码库 $ git init [project-name] 下载一个项目和它的整个代码历史 $ git clone [url] 配置 显示当前的Git配置 $ git config --list 编辑Git配置文件 $ git config -e…

HTTP和TCP代理原理及实现,主要是理解

Web 代理是一种存在于网络中间的实体&#xff0c;提供各式各样的功能。现代网络系统中&#xff0c;Web 代理无处不在。我之前有关 HTTP 的博文中&#xff0c;多次提到了代理对 HTTP 请求及响应的影响。今天这篇文章&#xff0c;我打算谈谈 HTTP 代理本身的一些原理&#xff0c;…

C++完成Query执行sql语句的接口封装和测试

1、在LXMysql.h 创建Query执行函数 //封装 执行sql语句 if sqllen 0 strlen获取字符长度bool Query(const char*sql,unsigned long sqllen0); 2、在LXMysql.cpp编写函数 bool LXMysql::Query(const char* sql, unsigned long sqllen){if (!mysql)//如果mysql没有初始化好{c…

使用qtquick调用python程序

一. 内容简介 使用qtquick调用python程序 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本又无法编译64位程序&#xf…

UE4 4.21使用编辑器蓝图EditorBlueprint方法

在UE4 4.21中&#xff0c;编辑器蓝图&#xff08;Editor Blueprint&#xff09;是一个强大的工具&#xff0c;允许开发者扩展和自定义Unreal编辑器的功能。通过编辑器蓝图&#xff0c;我们可以创建自定义的工具和功能&#xff0c;以优化开发流程。 本教程将指导您如何在UE4 4.…

几种vue后台管理框架介绍

几种vue后台管理框架介绍 1. vue-element-admin2. RuoYi3. iview-admin4. D2Admin5. vue-admin-beautiful6. el-admin7. vue3element-plus 【毒蘑菇】8. Django-Vue-Admin基于djangovue前后端分离开箱即用框架9. vue3-element-admin 1. vue-element-admin 推荐指数&#xff1a…