SwiftUI之深入解析如何使用accessibilityChartDescriptor视图修饰符为视图构建音频图表

一、DataPoint 结构体

  • 在 SwiftUI 中构建一个简单的条形图视图开始,该视图使用垂直条形显示一组数据点。如下所示,有一个 DataPoint 结构,用于描述条形图视图中的条形,它具有 id、标签、数值和填充颜色:
struct DataPoint: Identifiable {let id = UUID()let label: Stringlet value: Doublelet color: Color
}

二、BarChartView 结构体

  • 接下来,可以定义一个条形图视图,它接受一组 DataPoint 结构体实例并将它们显示出来,如下所示,有一个 BarChartView,它接收一组 DataPoint 实例并将它们显示为水平堆栈中不同高度的圆角矩形:
struct BarChartView: View {let dataPoints: [DataPoint]var body: some View {HStack(alignment: .bottom) {ForEach(dataPoints) { point inVStack {RoundedRectangle(cornerRadius: 8, style: .continuous).fill(point.color).frame(height: point.value * 50)Text(point.label)}}}}
}

三、ContentView 结构体

  • 在 SwiftUI 中可以轻松构建条形图视图,接下来尝试使用带有示例数据的新 BarChartView,如下所示,创建了一组 DataPoint 实例的示例数组,并将其传递给 BarChartView,还为图表创建了一个可访问元素,并禁用了其子元素的可访问性信息。为了改进图表视图的可访问性体验,还添加了可访问性标签。
struct ContentView: View {@State private var dataPoints = [DataPoint(label: "1", value: 3, color: .red),DataPoint(label: "2", value: 5, color: .blue),DataPoint(label: "3", value: 2, color: .red),DataPoint(label: "4", value: 4, color: .blue),]var body: some View {BarChartView(dataPoints: dataPoints).accessibilityElement().accessibilityLabel("Chart representing some data")}
}
  • 最后,可以开始为条形图视图实现音频图表功能,音频图表可以通过旋钮菜单获得。要使用旋钮,请在 iOS 设备的屏幕上旋转两个手指,就像拨盘。VoiceOver 会说出第一个旋钮选项,继续旋转手指以听到更多选项,松开手指选择音频图表,然后在屏幕上上下滑动手指以导航。
  • 音频图表允许用户使用音频组件理解和解释图表数据,VoiceOver 在移动到图表视图中的条形时播放具有不同音调的声音。VoiceOver 对于更大的值使用高音调,对于较小的值使用低音调,这些音调代表数组中的数据。

四、实现协议

  • 现在可以讨论在 BarChartView 中实现此功能的方法。首先必须创建一个符合 AXChartDescriptorRepresentable 协议的类型,AXChartDescriptorRepresentable 协议只有一个要求,即创建 AXChartDescriptor 类型的实例。AXChartDescriptor 类型的实例表示图表中的数据,以 VoiceOver 可以理解和交互的格式呈现。
extension ContentView: AXChartDescriptorRepresentable {func makeChartDescriptor() -> AXChartDescriptor {let xAxis = AXCategoricalDataAxisDescriptor(title: "Labels",categoryOrder: dataPoints.map(\.label))let min = dataPoints.map(\.value).min() ?? 0.0let max = dataPoints.map(\.value).max() ?? 0.0let yAxis = AXNumericDataAxisDescriptor(title: "Values",range: min...max,gridlinePositions: []) { value in "\(value) points" }let series = AXDataSeriesDescriptor(name: "",isContinuous: false,dataPoints: dataPoints.map {.init(x: $0.label, y: $0.value)})return AXChartDescriptor(title: "Chart representing some data",summary: nil,xAxis: xAxis,yAxis: yAxis,additionalAxes: [],series: [series])}
}
  • 我们所需做的就是符合 AXChartDescriptorRepresentable 协议,并添加 makeChartDescriptor 函数,该函数返回 AXChartDescriptor 的实例。首先,通过使用 AXCategoricalDataAxisDescriptor 和 AXNumericDataAxisDescriptor 类型定义 X 轴和 Y 轴,我们希望在 X 轴上使用字符串标签,这就是为什么使用 AXCategoricalDataAxisDescriptor 类型的原因。在线图的情况下,将在两个轴上都使用 AXNumericDataAxisDescriptor 类型。

五、实现线图

  • 接下来,使用 AXDataSeriesDescriptor 类型定义图表中的点,有一个 isContinuous 参数,允许定义不同的图表样式。例如,对于条形图,它应该是 false,而对于线图,它应该是 true。
struct ContentView: View {@State private var dataPoints = [DataPoint(label: "1", value: 3, color: .red),DataPoint(label: "2", value: 5, color: .blue),DataPoint(label: "3", value: 2, color: .red),DataPoint(label: "4", value: 4, color: .blue),]var body: some View {BarChartView(dataPoints: dataPoints).accessibilityElement().accessibilityLabel("Chart representing some data").accessibilityChartDescriptor(self)}
}
  • 作为最后一步,使用 accessibilityChartDescriptor 视图修饰符将符合 AXChartDescriptorRepresentable 协议的实例设置为描述图表的实例。结果如下:

在这里插入图片描述

六、总结

  • 音频图表功能对于视力受损的用户来说是一项重大改进。音频图表功能的好处是,可以将其用于任何想要的视图,甚至包括图像视图,只需创建 AXChartDescriptor 类型的实例。

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

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

相关文章

Flutter GetX 之 路由管理

路由管理是插件GetX常用功能之一,为什么说之一呢?因为GetX的功能远不止路由管理这么简单。 GetX的重要功能如下: 1、路由管理2、状态管理3、国际化4、主题5、GetUtil工具6、dialog 弹框7、snackbar 其实上面功能介绍的还是不够详细&#xff…

CentOS 7.8 安装 Docker

1.卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine2.安装依赖 sudo yum -y install gcc sudo yum -y install gcc-c3.安装软件包 sudo yum inst…

Sentinel 使用

使用教程:Sentinel 使用教程

格密码基础:对偶格(超全面)

目录 一. 对偶格的格点 1.1 基本定义 1.2 对偶格的例子 1.3 对偶格的图形理解 二. 对偶格的格基 2.1 基本定义 2.2 对偶格的格基证明 三. 对偶格的行列式 3.1 满秩格 3.2 非满秩格 四. 重复对偶格 五. 对偶格的转移定理(transference theorem&#xff…

2.0.0 BGP高级特性-ASFilter、CommunityFilter、ORF、对等组

Peer Group BGP对等体组 在网络中出现多台设备配置相近的情况下,使用对等体组可以极大的减少配置命令的输入。 与端口组类似,通过创建一个组,然后将成员添加入其中,可以对组中的成员进行统一的管理。 案例配置1 以AR2为例&…

透明OLED屏价格:影响因素与市场趋势

在当今的显示技术领域,透明OLED屏以其独特的透明特性和出色的显示效果,正逐渐成为市场的新宠。然而,对于许多消费者和企业来说,透明OLED屏的价格仍是关注的焦点。作为OLED透明屏市场部总监,我认为了解影响透明OLED屏价…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-6频率响应与滤波器

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-6频率响应与滤波器 1st order system 一阶系统 低通滤波器——Loss Pass Filter

java: 从HBase中读取数据

一、添加依赖&#xff1a; <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupI…

借助文档控件Aspose.Words,使用 Java 在 Word 文档中创建表格

Microsoft Word 是一种流行的文字处理应用程序&#xff0c;用于创建各种类型的文档。这些文档可能包含多种类型的元素&#xff0c;包括文本、图像、表格和图表。当涉及到用 Java 自动创建和操作文档时&#xff0c;您可能需要一个轻松的解决方案来在 Word 文档中创建表格。因此&…

Ceph Large omap objects现象及原理分析

Large omap objects现象 以下是真实的问题场景&#xff0c;以此文进行记录并分享。 Q1&#xff1a;集群出现了Large omap objects告警&#xff0c;这是什么问题&#xff1f;有什么影响&#xff1f; Q2&#xff1a;Large omap objects告警的触发条件是什么&#xff1f; Q3&am…

系列十一、(三)Sentinel控制台

一、Sentinel控制台 二、实时监控 2.1、概述 实时监控&#xff0c;顾名思义是用来实时监控的&#xff0c;具体监控的是接口请求通过的QPS和拒绝的QPS&#xff0c;默认情况下没有访问记录&#xff0c;所以看不到任何记录&#xff0c;需要访问接口才会有记录。另外需要注意&…

YOLOv8改进 | 损失篇 | VarifocalLoss密集目标检测专用损失函数 (VFLoss,原论文一比一复现)

一、本文介绍 本文给大家带来的是损失函数改进VFLoss损失函数,VFL是一种为密集目标检测器训练预测IoU-aware Classification Scores(IACS)的损失函数,我经过官方的版本将其集成在我们的YOLOv8的损失函数使用上,其中有很多使用的小细节(否则按照官方的版本使用根本拟合不了…

selenium元素单击不稳定解决方法

selenium自动化测试过程中&#xff0c;经常会发现某一元素单击&#xff0c;很不稳定&#xff0c;有时候执行了点击没有反映。 以下总结两种解决方法&#xff1a;都是通过js注入的方式去点击。 1.F12查一看&#xff0c;要点击的按钮&#xff0c;或连接&#xff0c;有没有οncl…

原生微信小程序AR(扫描指定图片显示glb模型)

效果 ar案例视频 准备&#xff1a;需要准备要扫描的图片地址和扫描成功后显示的模型 1.在components创建组件 index.js文件代码 Component({properties: {title: {type: String,value: ,},intro: {type: String,value: ,},hint: {type: String,value: ,},code: {type: String…

二叉树层次建树

#include <stdio.h> #include <stdlib.h>typedef char BiElemType; typedef struct BiTNode {BiElemType data;struct BiTNode *lChild;struct BiTNode *rChild;//左右节点 } BiTNode, *BiTree; //辅助队列 typedef struct tag {BiTree p;//树的某一个节点&#xf…

Python基础知识总结2——python中的字符串

python字符串 字符串基本特点空字符串和len()函数转义字符字符串拼接字符串复制不换行打印从控制台读取字符串replace() 实现字符串替换str()实现数字转型字符串使用[]提取字符字符串切片slice操作split()分割和join()合并字符串驻留机制和字符串比较字符串比较和同一性成员操作…

如何使用 Python 解决网络抓取中的 reCAPTCHA 问题

在网络抓取的领域&#xff0c;开发人员经常面临 reCAPTCHA 的障碍。为了区分人类和自动化机器人&#xff0c;reCAPTCHA 可能会成为那些试图从网站提取数据的人的沉痛阻碍。然而&#xff0c;借助 Python 和像 Capsolver 这样的工具&#xff0c;可以绕过 reCAPTCHA 并继续抓取有价…

shell 获取主机IP 脚本中使用IP 打印出来IP

目录 查看ip查看网关只查看ens33过滤ip拿到网卡名字对内容进行切片获取第一网卡IP &#xff08;head -1 表示第一个网卡&#xff09;脚本中打印IP 查看ip ip a 查看网关 ip r只查看ens33 ip a show dev ens33过滤ip ip a | grep -oE [0-9]\.[0-9]\.[0-9]\.[0-9] 拿到网卡名…

SQL的联合主键

在SQL中&#xff0c;联合主键是指由多个列组成的主键。联合主键的作用是确保每一行数据的唯一性&#xff0c;即组合列的值必须唯一。可以使用以下语法定义联合主键&#xff1a; CREATE TABLE 表名 (列1 数据类型,列2 数据类型,列3 数据类型,...PRIMARY KEY (列1, 列2, 列3, ..…

扩展 apiserver 连接认证 ip, apiserver证书更新

本文来自我的博客地址 文章目录 问题场景:问题分析:问题解决:查看 apiserver 证书支持的 ip 或 host使用 openssl 生成证书:再次查看 apiserver 证书支持的 ip 或 host 再次尝试将 master 加点加入参考 问题场景: k8s 1.28.1 集群后期新增 vip apiserver 证书不支持 vip 引入…