如何在 SwiftUI 中熟练使用 sensoryFeedback 修饰符

在这里插入图片描述

文章目录

    • 前言
    • 背景介绍
    • 平台支持
      • 仅支持watchOS
      • 支持watchOS和iOS
    • 基本用法
    • 预定义样式
    • 根据触发器值选择样式
    • 使用场景
      • 当值更改时触发
      • 使用条件闭包触发
      • 使用反馈闭包触发
    • 可以运行 Demo
    • 总结

前言

SwiftUI 引入了新的 sensoryFeedback 视图修饰符,使我们能够在所有 Apple 平台上播放触觉反馈。下面我们将学习如何使用 sensoryFeedback 修饰符在应用程序中的不同操作中提供触觉反馈。

背景介绍

在 iOS 17 之前,如果你想要从 SwiftUI 视图中向用户提供触觉反馈,你会使用其中一个 UIKit(或 AppKit)的反馈生成器。例如,使用选择反馈生成器:

struct ListView: View {@Binding var store: Storelet generator = UISelectionFeedbackGenerator()var body: some View {List(store.items, selection: $store.selection) { ... }.onChange(of: store.selection) { oldValue, newValue inif newValue != nil {generator.selectionChanged()}}}
}

在 iOS 17 中,Apple 直接向 SwiftUI 中添加了一系列感觉反馈的视图修饰符,以播放触觉和/或音频反馈。

平台支持

并非所有平台都支持所有反馈选项。以下是我所知道的每个平台上可用的内容列表。请注意,iPad不支持触觉反馈。

仅支持watchOS

  • start:活动开始
  • stop:活动停止

支持watchOS和iOS

  • decrease:重要值减少到显着阈值以下
  • increase:重要值增加到显着阈值以上
  • selection:UI元素的值正在更改
  • success:任务成功完成
  • warning:任务产生警告
  • error:任务产生错误
  • impact:UI元素碰撞时的物理冲击

请注意,impact反馈有两个变体,让您指定元素碰撞的重量(轻,中,重)或灵活性(刚性,柔软,实心)。在这两种情况下,您还可以更改强度(默认为1.0):

// 默认impact反馈
.impact()// 具有柔韧性并增加强度的impact
.impact(flexibility: .rigid, intensity: 2.0)// 具有重量并增加强度的impact
.impact(weight: .heavy, intensity: 2.0)

基本用法

要在 SwiftUI 视图中播放触觉反馈,我们只需要使用 sensoryFeedback 视图修饰符,带有两个参数。第一个定义了反馈样式,第二个是触发器值。

struct ContentView: View {@State private var store = Store()var body: some View {NavigationStack {List(store.results, id: \.self) { result inText(result)}.searchable(text: $store.query).sensoryFeedback(.success, trigger: store.results)}}
}

在上面的示例中,我们使用 sensoryFeedback 视图修饰符,带有成功样式。我们还将存储的 results 属性定义为触发器。这意味着 SwiftUI 将在存储的结果更改时播放成功样式的触觉反馈。

预定义样式

SwiftUI 提供了许多预定义的反馈样式,如 successwarningerrorselectionincreasedecreasestartstopalignmentlevelChangeimpact 等。

struct ContentView: View {@State private var trigger = falsevar body: some View {NavigationStack {Button("Action") {// 进行某些操作trigger.toggle()}.sensoryFeedback(.impact(weight: .heavy, intensity: 0.9),trigger: trigger)}}
}

如上所示,impact 样式允许我们调整反馈的权重和强度。请记住,最好使用预定义的样式,并在超级自定义的情况下自定义触觉反馈。

根据触发器值选择样式

sensoryFeedback 视图修饰符的另一种变体允许我们根据触发器值选择特定的反馈样式。在这里,我们在存储包含结果时播放成功反馈,并在结果为空时播放错误反馈。

struct ContentView: View {@State private var store = Store()var body: some View {NavigationStack {List(store.results, id: \.self) { result inText(result)}.searchable(text: $store.query).sensoryFeedback(trigger: store.results) { oldValue, newValue inreturn newValue.isEmpty ? .error : .success}}}
}

SwiftUI 还提供了在触发器值上定义条件的选项,决定是否播放预定义的反馈样式。

使用场景

这些感觉反馈修饰符都是基于触发器的。触发器需要是可等同的类型。有三种感觉反馈视图修饰符的变体:

当值更改时触发

struct ListView: View {@Binding var store: Storevar body: some View {List(store.items, selection: $store.selection) { ... }.sensoryFeedback(.selection, trigger: store.selection)}
}

视图修饰符的第一个参数是 SensoryFeedback 类型。并非所有反馈类型都适用于所有平台。当触发器值更改时,反馈会播放。

使用条件闭包触发

如果要更灵活地控制何时触发反馈,请使用带有条件闭包版本的视图修饰符。例如,仅在选择更改为非空值时播放选择反馈:

.sensoryFeedback(.selection, trigger: store.selection) {oldValue, newValue innewValue != nil
}

条件闭包接收监视的触发器值的旧值和新值。在闭包中,返回一个布尔值,指示是否应播放反馈。

使用反馈闭包触发

要控制播放何种反馈,请使用视图修饰符的反馈闭包版本。例如,基于错误代码提供警告或错误反馈:

// @State private var errorCode: Int = 0.sensoryFeedback(trigger: errorCode) { oldValue, newValue inswitch newValue {case 1: .warningcase 2: .errordefault: nil}
}

在这种情况下,在闭包中返回所需的反馈,如果不想要任何反馈,则返回nil。

可以运行 Demo

提供一个可以运行的 Demo,完整代码如下:

import SwiftUIstruct ContentView: View {@State private var store = Store()var body: some View {NavigationView {List(store.results, id: \.self) { result inText(result)}.searchable(text: $store.query).sensoryFeedback(.success, trigger: store.results).navigationTitle("Sensory Feedback Demo")}}
}struct Store {@State var query: String = ""@State var results: [String] = ["Result 1", "Result 2", "Result 3"]
}

Demo 包括一个带有触觉反馈的 SwiftUI 列表。你可以根据需要进行进一步的调整和扩展。

总结

SwiftUI引入了新的sensoryFeedback视图修饰符,为所有Apple平台提供触觉反馈。通过简单的附加,我们可以定义反馈样式和触发器值,实现了在应用程序中不同操作产生的触觉效果。支持多种预定义样式,如success、warning、error,以及个性化的impact样式。对于触发器值的处理也非常灵活,可以根据其条件选择不同的反馈样式。

总体而言,这个新的视图修饰符为提高应用的可访问性和用户体验提供了简便的方式。在使用时需谨慎,避免过多干扰用户。希望通过学习这个新特性,开发者能更好地运用触觉反馈功能,提升应用的交互性。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【UE5.3】笔记8 添加碰撞,检测碰撞

添加碰撞 打开BP_Food,添加Box Collision组件,与unity类似: 调整Box Collision的大小到刚好包裹物体,通过调整缩放和盒体范围来控制大小,一般先调整缩放找个大概大小,然后调整盒体范围进行微调。 碰撞检测 添加好碰撞…

OpenSSH for Windows安装和卸载方法

文章目录 一、关于OpenSSH for Windows二、OpenSSH 在Windows中进行安装三、安装或者卸载OpenSSH for Windows四、启动openssh for Windows五、通过openssh 连接Server推荐阅读 一、关于OpenSSH for Windows OpenSSH 是安全 Shell (SSH) 工具的开放源代码版本,Linu…

进程、程序、应用程序之间的关系

文章目录 进程和程序进程和应用程序总结参考资料 进程和程序 程序:程序是存放在硬盘中的可执行文件,主要包括代码指令和数据。程序本身是一个静态的文件,只有在被操作系统加载到内存中并执行时才会变成进程。 进程:进程是程序在…

gitLab使用流程

标题1.配置账户 git config --global user.name git config --global user.email mygitlabmali.cn 标题2.生成秘匙 ssh-keygen -t rsa -C “mygitlabmail.cn” 。 //输入命令后一直回车 ,输入命令后一直回车(密码可以不填),至…

昇思25天学习打卡营第8天|ResNet50迁移学习

一、迁移学习定义 迁移学习(Transfer Learning):在一个任务上训练得到的模型包含的知识可以部分或全部地转移到另一个任务上。允许模型将从一个任务中学到的知识应用到另一个相关的任务中。适用于数据稀缺的情况,可减少对大量标记…

vscode连接SSH——连接学校服务器,使用conda配置个人环境并使用

服务器的连接 在vscode远程资源管理中配置配置文件,如下图: 然后点击左下角进行连接: 点击需要连接的服务器,输入对应密码即可登录成功。 服务器上创建自己的环境 确保服务器上已安装anaconda。 先查看服务器上的conda信息&…

2.4章节python中字符串类型

在Python中,字符串(String)是一种基本的数据类型,用于表示文本信息。字符串可以包含字母、数字、标点符号或任何Unicode字符。Python中的字符串是不可变的,这意味着一旦创建了字符串,就不能更改字符串中的字…

CV02_超强数据集:MSCOCO数据集的简单介绍

1.1 简介 MSCOCO数据集,全称为Microsoft Common Objects in Context,是由微软公司在2014年推出并维护的一个大规模的图像数据集,旨在推动计算机视觉领域的研究,尤其是目标识别、目标检测、实例分割、图像描述生成等任务。该数据集…

使用Rough.js库在画布上绘制一只毛毛虫

本文由ScriptEcho平台提供技术支持 项目地址:传送门 代码应用场景介绍 本代码使用Rough.js库在画布上绘制一只毛毛虫。 代码基本功能介绍 初始化画布: 使用Rough.js库创建画布,并设置画布尺寸。 绘制毛毛虫身体: 使用椭圆形和…

Spring Boot集成jacoco实现单元测试覆盖统计

1.什么是jacoco? JaCoCo,即 Java Code Coverage,是一款开源的 Java 代码覆盖率统计工具。支持 Ant 、Maven、Gradle 等构建工具,支持 Jenkins、Sonar 等持续集成工具,支持 Java Agent 技术远程监控 Java 程序运行情况…

《昇思25天学习打卡营第10天|使用静态图加速》

文章目录 今日所学:一、背景介绍1. 动态图模式2. 静态图模式 三、静态图模式的使用场景四、静态图模式开启方式1. 基于装饰器的开启方式2. 基于context的开启方式 总结: 今日所学: 在上一集中,我学习了保存与加载的方法&#xff…

标贝语音识别在智能会议系统的应用案例

语音识别是指将语音信号转换成文本或者其他数字信号形式的过程,随着人工智能在人们日常工作生活中的普及,语音识别技术也被广泛的应用在智能家居、智能会议、智能客服、智能驾驶等领域,以语音识别技术在智能会议系统中的应用为例,…

Graspnet复现笔记

前言 参考文章:Baseline model for "GraspNet-1Billion: A Large-Scale Benchmark for General Object Grasping" (CVPR 2020).[paper] [dataset] [API] [doc] 代码仓库:https://github.com/graspnet/graspnet-baseline 一、确定配置 Ubuntu18.04 CUDA版本(作者…

MaxKB开源知识库问答系统发布v1.3.0版本,新增强大的工作流引擎

2024年4月12日,1Panel开源项目组正式发布官方开源子项目——MaxKB开源知识库问答系统(github.com/1Panel-dev/MaxKB)。MaxKB开源项目发布后迅速获得了社区用户的认可,成功登顶GitHub Trending趋势榜主榜。 截至2024年7月4日&…

Java后端每日面试题(day3)

目录 Spring中Bean的作用域有哪些?Spring中Bean的生命周期Bean 是线程安全的吗?了解Spring Boot中的日志组件吗? Spring中Bean的作用域有哪些? Bean的作用域: singleton:单例,Spring中的bean默…

利用C语言实现三子棋游戏

文章目录 1.游戏界面2.游戏内容2.1 棋盘类型2.2棋盘的初始化2.3 打印棋盘的界面展示 3.游戏操作3.1 玩家操作3.2 电脑操作3.3 胜负判定 4.代码整合 1.游戏界面 无论写任何程序,我们都需要先去了解它的大概框架,这里我们先把它的初始界面写出来。一个游戏…

class类和style内联样式的绑定

这里的绑定其实就是v-bind的绑定,如代码所示,div后面的引号就是v-bind绑定,然后大括号将整个对象括起来,对象内先是属性,属性后接的是变量,这个变量是定义在script中的,后通过这个变量&#xff…

电气-伺服(6)脉冲控制

一、脉冲模式原理: 运动控制器输出脉冲信号给伺服驱动器 伺服驱动器工作于位置模式 伺服驱动器内部要完成三闭环(位置闭环 、速度闭环、电流环) 脉冲和伺服控制环:脉冲的个数作用于位置环。脉冲的频率作用于速度环 二、脉冲的两…

重载赋值运算符

c编译器可能会给类添加四个函数 1默认构造函数 2默认析构函数 3默认拷贝构造函数&#xff0c;对成员变量进行浅拷贝。 4默认赋值函数&#xff0c;队成员变量进行浅拷贝。 #include<iostream> using namespace std; class CGirl { public:int m_bh;string m_name;voi…

RedHat / CentOS安装FTP服务

本章教程,记录在RedHat / CentOS中安装FTP的具体步骤。FTP默认端口:21 1、安装 epel 源 yum install -y epel-release2、安装 pure-ftpd yum -y install pure-ftpd3、修改默认配置 # 默认配置位于 /etc/pure-ftpd/pure-ftpd.conf,在配置文件中找到下面几个参数进行修改:#…