我正在尝试(...)为添加到 UIAlertController 的按钮添加声音效果。我在处理程序中发出声音效果,但这实际上有点太晚了。声音像 0.5 秒一样迟到了。我希望在警报即将解除时立即发出声音,而不是在解除后发出声音。使用 UIAlertView 可以使用 alertWillDismiss... 而不是 alertDidDismiss 来处理。
我错过了什么?
我正在尝试(...)为添加到 UIAlertController 的按钮添加声音效果。我在处理程序中发出声音效果,但这实际上有点太晚了。声音像 0.5 秒一样迟到了。我希望在警报即将解除时立即发出声音,而不是在解除后发出声音。使用 UIAlertView 可以使用 alertWillDismiss... 而不是 alertDidDismiss 来处理。
我错过了什么?
不,你没有错过任何东西。UIAlertController 不提供您正在寻找的功能。考虑提供您自己的呈现视图控制器,您将拥有您所追求的那种精细控制。
我使用了 Patrick Goley 的建议,即继承 UIAlertController 并覆盖 viewWillDisappear。对我来说效果很好。
//
// ImmediateClickAlertController.swift
//
// This subclass of UIAlertController plays a click immediately whenever it is dismissed (i.e. when a button is tapped).
// This fixes an issue when trying to play a click in an attached UIAlertAction, which does not happen until after its view disappears.
import AudioToolbox
class ImmediateClickAlertController: UIAlertController {
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
// play a click
let pressKeySystemSoundID: SystemSoundID = 1104
AudioServicesPlaySystemSound(pressKeySystemSoundID)
}
}
有点骇人听闻,但也许你可以:
selected
和/或highlighted
属性的任何更改(我自己的经验是这selected
不是可靠地可观察的,而highlighted
确实是)。...但是所有这些都非常脆弱,不优雅,可能会在操作系统的未来版本中中断和/或让您被应用商店拒绝...?
所以你最好的选择(即使最费力)是滚动你自己的模态视图控制器:
我按照上述文档制作的演示项目UIAlertController
(带有嵌入式的自定义“相似” UIActivityIndicator
- 用于长时间的异步过程):