SwiftUI 5.0(iOS 17.0)触摸反馈“震荡波”与触发器模式趣谈

server/2024/9/24 12:39:38/

在这里插入图片描述

概览

要想创作出一款精彩绝伦的 App,绚丽的界面和灵动的动画并不是唯一吸引用户的要素。有时我们还希望让用户真切的感受到操作引发的触觉反馈,直击使用者的灵魂。

在这里插入图片描述

所幸的是新版 SwiftUI 原生提供了实现触觉震动反馈的机制。在介绍它之后我们还将进一步展开讨论该机制基于的触发器模式,并“青出于蓝而胜于绿”的设计我们自己的触发器实现。

在本篇博文中,您将学到如下内容:

相信学完本课后,小伙伴们对于 SwiftUI 中触觉反馈与触发器开发模式会有更深刻的领悟,从而能够更加游刃有余的使用它们。

那还等什么呢?We will rock you!!!😉


1. “震荡波”来袭

除了从视觉上强势吸引用户眼球之外,我们的 App 还可以用“更立体”的方式让用户爱不释手。是滴,我们就是要用触觉反馈震动他们“久逢甘露”的双手,用“震荡波”激荡他们的心灵。

震动反馈Haptic )是 Apple 对于移动设备提供的一种加强用户体验的机制,它最早诞生于 UIKit。它的体验有点类似于之前 iPhone 中 3D Touch 的功能。

Haptic 被广泛应用在 iOS/iPadOS 中,Apple 系统在用户交互中大量使用了震动反馈,比如在锁屏状态下点击 iPhone 屏幕左下角的手电筒按钮:

在这里插入图片描述

或者 iPhone 隔空投送完成时给于用户的提示反馈,以及 AppleWatch 上的通知提醒等等。

更多 Haptic 撸码的相关介绍,请小伙伴们移步 Apple 官方开发网站观赏进一步内容:

  • Playing a single-tap haptic pattern

在这里插入图片描述

在这里插入图片描述

前面说过 Haptic 最先是在 UIKit 中得到很好支持的,从 SwiftUI 5.0iOS 17.0)开始苹果终于推出了 SwiftUI 里 Haptic 的原生实现 SensoryFeedback

在这里插入图片描述

如上所示,SensoryFeedback 结构的“借花献佛”是通过视图扩展方法 sensoryFeedback 来完成的:

@available(iOS 17.0, macOS 14.0, tvOS 17.0, watchOS 10.0, *)
@available(visionOS, unavailable)
extension View {/// - Parameters:///   - feedback: Which type of feedback to play.///   - trigger: A value to monitor for changes to determine when to play.public func sensoryFeedback<T>(_ feedback: SensoryFeedback, trigger: T) -> some View where T : Equatable/// - Parameters:///   - feedback: Which type of feedback to play.///   - trigger: A value to monitor for changes to determine when to play.///   - condition: A closure to determine whether to play the feedback when///     `trigger` changes.public func sensoryFeedback<T>(_ feedback: SensoryFeedback, trigger: T, condition: @escaping (_ oldValue: T, _ newValue: T) -> Bool) -> some View where T : Equatable/// - Parameters:///   - trigger: A value to monitor for changes to determine when to play.///   - feedback: A closure to determine whether to play the feedback and///     what type of feedback to play when `trigger` changes.public func sensoryFeedback<T>(trigger: T, _ feedback: @escaping (_ oldValue: T, _ newValue: T) -> SensoryFeedback?) -> some View where T : Equatable}

可以看到 sensoryFeedback 方法拥有多个重写形式,但它们都毫无例外的使用了触发器模式(Trigger Mode)。

2. 触发器模式

什么是触发器模式呢?在 Apple 的开发中大家可能对观察者模式早就有所耳闻,触发器模式与此类似也属于苹果开发中的一种设计模式。触发器模式就是让状态的改变触发代码的执行。

在以状态驱动的 SwiftUI 王国中,触发器模式的使用更显得“如鱼得水”,仿佛天造地设一般。

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

在上面的示例代码中,我们使用 sensoryFeedback 修改器方法为视图添加了震动反馈。其中可以看到:Haptic 产生的触发器是 store.results 状态,即当用户引起 Store 搜索结果发生改变时,我们纤细指尖才会喜提激荡震动着的触觉洗礼。

除了感受系统内置震动效果对“心灵的冲击”以外,我们还可以让震动更加“变幻莫测”:

VStack {}
.sensoryFeedback(.impact(weight: .heavy, intensity: 0.9),trigger: trigger
)

类似的,大家还可以根据状态实际的值来决定到底使用何种 Haptic 效果,比如在下面的代码中我们就根据搜索是否成功来决定采用 .error 还是 .success 震动反馈类型:

List(store.results, id: \.self) { result inText(result)}.searchable(text: $store.query).sensoryFeedback(trigger: store.results) { oldValue, newValue inreturn newValue.isEmpty ? .error : .success}

注意,上面所有 Haptic 效果只有在触发器对应状态发生改变时才会产生,所以我们不用担心视图创建时触发器导致不希望的“副作用”。

3. SwiftUI 触发器模式的其它应用

除了 Haptic 对应的实现以外,在 SwiftUI 中还有很多其它功能也大量适配触发器模式。比如 scrollIndicatorsFlash 修改器方法:

在这里插入图片描述

scrollIndicatorsFlash 方法用来在指定状态发生改变时来“闪烁”可滚动视图中的滚动条:

struct TriggerValueExample: View {let messages: [String]var body: some View {List(messages, id: \.self) { message inText(verbatim: message)}.scrollIndicatorsFlash(trigger: messages)}
}

在上面的代码中,当有新消息到来时我们会“闪烁”列表的滚动条以提示用户。

4. 自定义触发器模式

通过上面的介绍,想必大家对于何为触发器模式以及它的工作原理已经了然于心了。触发器模式在 SwiftUI 中被广泛地使用着,那我们能不能“百尺竿头更进一步”打造自己的触发器呢?

答案是肯定的!

正如观察者模式那样,设计模式意味着提供充分可定制的灵活性,除了使用系统框架提供的触发器以外,我们当然可以随心所欲地创建自己的触发器

假如我们希望在 SwiftUI 中当某一状态发生改变时播放指定的声音,这可以恰如其分的用触发器模式来实现:

struct PlaySoundViewModifier<Trigger: Equatable>: ViewModifier {let sound: URLlet trigger: Triggerfunc body(content: Content) -> some View {content.onChange(of: trigger) {if let player = try? AVAudioPlayer(contentsOf: sound) {player.play()}}}
}extension View {func playSound(_ sound: URL, trigger: some Equatable) -> some View {self.modifier(PlaySoundViewModifier(sound: sound, trigger: trigger))}
}

在上面的示例代码中,我们创建了 PlaySoundViewModifier 修改器方法,并绑定了一个遵守 Equatable 协议,类型为 Trigger 的属性,当 trigger 发生变化时,我们就利用 AVAudioPlayer 对象从容地播放想要的声音文件。

小伙伴们可以这样使用上面创建的 PlaySoundViewModifier 修改器方法:

struct SoundFeedbackExample: View {let messages: [String]var body: some View {List(messages, id: \.self) { message inText(verbatim: message)}.playSound(Bundle.main.url(forResource: "sound", withExtension: "wav")!,trigger: messages)}
}

看到了吗?触发器模式就是这么单刀直入,让代码实现变得如此直接了当。从此小伙伴们开发兵器库中又多了一件神兵利器,棒棒哒!💯


想要系统学习 Swift 语言的小伙伴们,千万不要错过我的《Swift 语言开发精讲》专栏哦:

在这里插入图片描述

  • Swift 语言开发精讲

总结

在本篇博文中,我们介绍了 SwiftUI 5.0iOS 17.0)中触觉反馈(Haptic)机制的实现,并由此抛砖引玉讨论了开发模式中的触发器模式,最后我们看到了实现自己心仪的触发器是多么的简单。

感谢观赏,再会!😎


http://www.ppmy.cn/server/11238.html

相关文章

关于Python中install edge_tts记录

如下代码&#xff1a; #!/usr/bin/env python3""" Basic audio streaming example.This example shows how to stream the audio data from the TTS engine, and how to get the WordBoundary events from the engine (which could be ignored if not needed).…

十大排序——7.希尔排序

下面我们来看一下希尔排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 希尔排序是插入排序的一种优化&#xff0c;可以理解为是一种分组的插入排序。 希尔排序的要点&#xff1a; 简单来说&#xff0c;就是分组实现插入&#xff0c;每组元素的间隙称为gap&#xff0c;…

比特币铭文铸造:数字货币的未来与挑战

比特币铭文铸造是一种创新的技术&#xff0c;它通过将比特币区块链上的交易信息转化为数字铭文&#xff0c;并将其铸造到实体货币中&#xff0c;从而实现了数字货币与实物资产的有机结合。这一技术不仅为比特币的未来发展开辟了新的道路&#xff0c;也为整个数字货币行业带来了…

有关栈的练习

栈练习1 给定一个栈&#xff08;初始为空&#xff0c;元素类型为整数&#xff0c;且小于等于 109&#xff09;&#xff0c;只有两个操作&#xff1a;入栈和出栈。先给出这些操作&#xff0c;请输出最终栈的栈顶元素。 操作解释&#xff1a; 1 表示将一个数据元素入栈&#xff…

图像处理技术与应用(一)

图像处理技术与应用入门 使用skimage进行图像读取和显示 skimage库&#xff08;Scikit-image&#xff09;提供了一个强大的工具集&#xff0c;用于执行各种图像处理任务。以下是如何使用skimage读取和显示图像的基本示例&#xff1a; from skimage import ioimg io.imread(…

2024 年中国VR行业研究报告

核心内容&#xff1a; 概述了当前 VR 行业的发展阶段、市场规模、产业环节及趋势&#xff0c;并对核心硬件、软件技术、内容应用等方面进行了详细介绍和分析。 概述&#xff1a; 1、行业发展阶段&#xff1a;新旧玩家推陈出新&#xff0c;特别是 Vision Pro 产品的问世&…

山东专升本计算机基础 --- Windows 10 操作系统安全

文章目录 Windows 10 操作系统安全1、Windows 10 系统安装的安全2、系统帐户安全3、应用安全策略4、网络安全策略 Windows 10 操作系统安全 1、Windows 10 系统安装的安全 操作系统的安全和安装操作系统的选项密切相关。 选择 NTFS 文件格式分区组件的定制安装 Windows 10 …

机器学习预测汽车油耗效率 MPG

流程 数据获取导入需要的包引入文件,查看内容划分训练集和测试集调用模型查看准确率 数据获取 链接&#xff1a;https://pan.baidu.com/s/1KeIJykbcVpsfEk0xjhiICA?pwd30oe 提取码&#xff1a;30oe --来自百度网盘超级会员V1的分享导入需要的包 import pandas as pd imp…