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

时间:2018-03-12 01:01:11

标签: ios swift xcode avaudioplayer 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)
    }
}
}

3 个答案:

答案 0 :(得分:2)

您缺少对要禁用的UI元素的任何引用。您只需在它们上设置button.isEnabled = false,并在播放器完成后将其设置回来。您可以通过将对象设置为delegate然后实施func audioPlayerDidFinishPlaying(_:successfully)来重新启动播放器来完成播放器。

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

player.delegate = self

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

答案 1 :(得分:1)

播放音频后,您可以拨打self.view.isUserInteractionEnabled = false

之后,在self.view.isUserInteractionEnabled = true

上使用audioPlayerDidFinishPlaying(_:successfully)

答案 2 :(得分:1)

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