我正在研究一种在调用时播放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)
}
}
}
答案 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()
重新启用触摸功能。这通常在动画期间调用,但这是您要求的。