实战教程·什么年代了还在敲传统木鱼?(二)
前提回顾
在上一章节中,我们完成了“电子木鱼”项目的基础部分,包含基础的UI样式、交互逻辑和动画效果。这一章节,我们来实现“电子木鱼”App的声音播放、自定义设置页面及其交互逻辑。
音频准备:木鱼敲击声
当每次点击木鱼的时候,电子木鱼App都需要发出“咚”的敲击声。我们在网上可以找到并下载木鱼敲击声,下载好的文件拖入到项目中,如下图所示:
在此请记住下载的音频的时长(通常为1秒),以及文件名称、文件后缀名(通常为mp3、m4a),在之后的代码中需准确调用。
紧接着,我们来实现音频播放相关的代码。音频播放需要使用到一个新的框架:AVFoundation。
AVFoundation是苹果在iOS和OS X系统中,用于处理基于时间的媒体数据的Objective-C框架,供使用者来开发媒体类型的应用程序。
AVFoundation框架可以用来实现播放声音的效果,首先需要在项目中引入AVFoundation框架,由于是Apple自带的框架,可以直接在项目中import导入,如下代码所示:
import AVFoundation
为了项目方便,我们可以创建一个新的Swift文件来放置播放音频的相关代码。创建一个新的Swift文件,命名为AudioPlayer。在AudioPlayer文件中,引入AVFoundation框架,预设一个播放器,然后创建一个方法来使用播放器,如下代码所示:
import AVFoundation import Foundation import SwiftUI var soundPlayer: AVAudioPlayer? func playAudio(forResource: String, ofType: String) { let path = Bundle.main.path(forResource: forResource, ofType: ofType)! let url = URL(fileURLWithPath: path) do { soundPlayer = try AVAudioPlayer(contentsOf: url) soundPlayer?.play() } catch { print("音频文件出现问题") } }
上述代码中,我们预先创建了一个播放器soundPlayer,然后创建了一个方法playAudio播放声音,传入两个参数,forResource用于确定所需播放的音频文件的文件名称,ofType为文件的后缀名。
确定后参数后,将两个参数值给到路径path,再把路径给到地址url,便于后面播放器使用。在代码中使用声音播放器AVAudioPlayer播放声音,如果尝试执行失败则打印输出错误信息。
完成后,回到Content文件,在点击木鱼时调用playAudio方法,如下代码所示:
playAudio(forResource: "dong", ofType: "mp3")
在预览窗口敲击了一下,效果不错(不禁笑出了声)。