我正在使用UIAlertController
设置一个非常标准的操作表:
let alert = UIAlertController(title: "title",
message: nil,
preferredStyle: .actionSheet)
alert.addAction(
UIAlertAction(title: "button",
style: .default,
handler: { _ in
MediaPlayer.playSound(.click)
// The above line just uses AVAudioPlayer to play
// an MP3 file. Its implementation isn't relevant
// to the question and can be assumed to be correct.
}))
当我按下按钮时,警报解除,然后完成处理程序运行并播放声音。由于警报的消除动画需要一段时间,因此在按下按钮和播放声音之间会有明显的延迟;当声音开始时,警报甚至不再可见。
有没有办法在按下按钮后立即播放声音,而不是等到解雇动画完成后才会播放声音?
此外,有没有一个简单的方法可以做到这一点?即Apple是否反对人们在其提醒按钮中添加点击声音?
答案 0 :(得分:2)
基本上你无能为力。一旦UIAlertController取代UIAlertView,用户点击和按钮的动作处理程序运行之间的延迟就很明显了:
UIAlertController dismiss is slow
实际上,您正在尝试做一些Apple不希望您做的事情,即将声音与警报控制器按钮相关联。
我对这类事情的解决方案很简单:不要使用UIAlertController。构建一个自定义呈现的视图控制器非常容易,该控制器像UIAlertController的视图一样只是 ,实际上UIAlertController 是一个呈现的视图控制器。所以滚动你自己。现在按钮是你的,你可以检测到水龙头并用声音回应然后解散,没问题。
答案 1 :(得分:0)
我不建议像Matt所建议的那样重建UIAlertController
(并在每次调整时对其进行更新以匹配iOS),我建议只是对其进行子类化。您可以给它提供一个代码块,以便在代码消失时运行它。例如:
class CustomAlertController: UIAlertController {
var onDisappear: (() -> Void)?
override func viewWillDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
onDisappear?()
}
}
然后您可以在显示警报控制器之前设置此块:
let controller = CustomAlertController(title: "Title", message: nil, preferredStyle: .actionSheet)
controller.onDisappear = {
// play sound here
}