UICollectionViewCell中按钮点击根据状态播放对应键盘音效问题
搞定CustomCell按钮切换状态+播放对应音效的问题
嘿,我来帮你补全代码并拆解关键逻辑,确保点击按钮时能正确切换isOn状态,同时播放对应的键盘音效:
完整代码实现
import UIKit import AVFoundation class CustomCell: UICollectionViewCell { // 私有状态标记,默认处于开启状态 private var isOn = true // 分别存按键音和退格音的播放器 private var keyPressPlayer: AVAudioPlayer? private var keyDeletePlayer: AVAudioPlayer? @IBOutlet weak private var button: UIButton! { didSet { // 给按钮绑定点击事件 button.addTarget(self, action: #selector(handleButtonTap), for: .touchUpInside) // 提前初始化好音效播放器 setupAudioPlayers() } } // 初始化音效播放器的私有方法 private func setupAudioPlayers() { // 加载按键音效文件(记得替换成你自己的音效文件名和格式) if let pressSoundPath = Bundle.main.path(forResource: "key_press", ofType: "wav") { let pressSoundURL = URL(fileURLWithPath: pressSoundPath) do { keyPressPlayer = try AVAudioPlayer(contentsOf: pressSoundURL) keyPressPlayer?.prepareToPlay() // 预加载,避免点击时延迟 } catch { print("按键音效初始化失败:\(error.localizedDescription)") } } // 加载退格音效文件 if let deleteSoundPath = Bundle.main.path(forResource: "key_delete", ofType: "wav") { let deleteSoundURL = URL(fileURLWithPath: deleteSoundPath) do { keyDeletePlayer = try AVAudioPlayer(contentsOf: deleteSoundURL) keyDeletePlayer?.prepareToPlay() } catch { print("退格音效初始化失败:\(error.localizedDescription)") } } } // 按钮点击的处理逻辑 @objc private func handleButtonTap() { // 切换isOn的状态 isOn.toggle() // 根据当前状态播放对应音效,同时可以更新按钮UI反馈 if isOn { keyPressPlayer?.play() button.setTitle("关闭", for: .normal) // 示例:修改按钮标题 } else { keyDeletePlayer?.play() button.setTitle("开启", for: .normal) } } // 可选:处理cell复用的状态重置 override func prepareForReuse() { super.prepareForReuse() // 复用的时候把状态改回初始值,避免旧状态影响新数据 isOn = true button.setTitle("开启", for: .normal) } }
关键细节说明
- 音效预加载:在
setupAudioPlayers里初始化播放器并调用prepareToPlay(),这样点击按钮时音效会立刻播放,不会有延迟感。 - 状态切换逻辑:用
isOn.toggle()简洁地切换布尔状态,然后根据新状态匹配对应的音效和UI变化。 - 复用处理:重写
prepareForReuse()是因为UICollectionView的cell会被复用,不重置状态的话,滚动时可能会出现状态混乱的问题。
额外小技巧
如果你不想自己导入音效文件,想直接用系统自带的键盘音效,可以改用AudioToolbox框架的方法,代码更简单:
import AudioToolbox // 在点击事件里替换播放逻辑: if isOn { AudioServicesPlaySystemSound(1104) // 系统按键音ID } else { AudioServicesPlaySystemSound(1105) // 系统退格音ID }
记得要导入AudioToolbox框架哦。
内容的提问来源于stack exchange,提问作者ajrlewis
相关产品推荐
相关产品推荐

