基于UIImageView播放对应声音失效问题求助
解决你的闪卡应用声音播放问题
嘿,我一眼就看出问题出在哪了!你的声音按钮总是播放同一个声音,主要有两个核心原因,咱们一个个说,再给你靠谱的解决方案:
问题1:直接比较UIImage实例根本不靠谱
每次调用UIImage(named: "xxx")的时候,系统大概率会创建一个全新的UIImage对象(哪怕是同一张图片)。这就意味着imageView.image == UIImage(named: "card1")这种比较几乎永远是false——因为它们是两个不同的对象实例,哪怕显示的内容一模一样。
问题2:条件判断逻辑有严重漏洞
看你写的声音播放代码:
if imageView.image == UIImage(named: "card1") { // 播放aSound } else if imageView.image != UIImage(named: "card2") { // 播放bSound } else if imageView.image != UIImage(named: "card3") { // 播放cSound }
第一个条件几乎永远不成立,直接进入第一个else if。而imageView.image != UIImage(named: "card2")又几乎永远是true(同样因为实例比较的问题),所以后面的else if根本不会执行,自然每次都只播放bSound。
另外顺便提一句,你切换图片的代码里有重复赋值的问题:
imageView.image = UIImage(named: "card2") imageView.image = UIImage(named: "card\(number)")
第一行的赋值完全是多余的,会被第二行直接覆盖,记得删掉哦!
解决方案:用图片名称跟踪当前显示内容
咱们不要直接比较UIImage,而是新增一个变量来记录当前显示的图片名称,这样判断就准确了。
步骤1:新增跟踪变量
在你的类里添加一个变量:
var currentImageName: String?
步骤2:修改图片切换逻辑
每次设置图片的时候,同时记录对应的名称,并且删掉多余的赋值:
if let tappedImageView = gesture.view as? UIImageView { imageView = tappedImageView var targetImageName: String if segControl.selectedSegmentIndex == 0 && segControl2.selectedSegmentIndex == 0 { number = number % 26 + 1 targetImageName = "card\(number)" } else if segControl.selectedSegmentIndex == 0 && segControl2.selectedSegmentIndex == 1 { number = number % 26 + 1 targetImageName = "upper\(number)" } else if segControl.selectedSegmentIndex == 0 && segControl2.selectedSegmentIndex == 2 { number = number % 10 + 1 targetImageName = "num\(number)" } else { // 处理其他分段控件组合的情况,这里可以设个默认图片 targetImageName = "default_card" } // 只需要一次赋值就够了 imageView.image = UIImage(named: targetImageName) // 记录当前图片名称 currentImageName = targetImageName }
步骤3:修改声音播放逻辑
基于currentImageName来判断要播放的声音,用switch会比一堆if-else更清晰:
guard let currentName = currentImageName else { print("No image is displayed") return } do { let soundPath: String switch currentName { case "card1": soundPath = aSound case "card2": soundPath = bSound case "card3": soundPath = cSound // 在这里继续添加其他图片对应的声音,比如card4、upper1等等 default: print("No matching sound found for image: \(currentName)") return } audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: soundPath)) audioPlayer.play() } catch { print("Couldn't load sound file: \(error.localizedDescription)") }
这样修改之后,你的声音按钮就能准确识别当前显示的图片,播放对应的声音啦!
内容的提问来源于stack exchange,提问作者Derek N
相关产品推荐
相关产品推荐

