如何在 AVAudioSession 期间禁用用户交互

How to disable user Interaction during AVAudioSession

我目前正在研究一种在调用时将播放 mp4 文件的方法。但是,在播放 mp4 文件时,我希望禁用用户交互。这样用户就无法在播放 mp4 时点击屏幕并重新启动相同的 AVAudioSession。到目前为止,我的代码是

import Foundation; import UIKit; import AVFoundation

var player: AVAudioPlayer?

class Card: NSObject
{
var image: UIImage
var soundUrl: String


init(image: UIImage, soundUrl: String, isActive:Bool = true) {
    self.image = image
    self.soundUrl = soundUrl
}
func playSound()
{
    guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
    do
    {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

        player = try AVAudioPlayer(contentsOf: url)
        guard let player = player else { return }
        player.prepareToPlay()

        player.play()

        print("play")
    } catch let error {
        print(error.localizedDescription)
    }
}
}

您缺少对要禁用的 UI 元素的任何引用。您只需在它们上设置 button.isEnabled = false,并在播放器完成后将它们设置回去。通过将对象设置为 delegate 然后执行 func audioPlayerDidFinishPlaying(_:successfully) 以重新打开播放器,您将知道播放器已完成。

请注意,没有理由在调用 play() 之前立即调用 prepareToPlay()play() 做好准备。


player.delegate = self

extension Card: AVAudioPlayerDelegate  {
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
        // re-enable UI
    }
}

您可以在播放音频后调用self.view.isUserInteractionEnabled = false

之后,在audioPlayerDidFinishPlaying(_:successfully)

上使用self.view.isUserInteractionEnabled = true

要禁用设备上的所有传入触摸,您可以调用 UIApplication.shared.beginIgnoringInteractionEvents() 并调用 UIApplication.shared.endIgnoringInteractionEvents() 重新启用触摸。这通常在动画期间调用,但这是您要求的。