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