3

我正在尝试(...)为添加到 UIAlertController 的按钮添加声音效果。我在处理程序中发出声音效果,但这实际上有点太晚了。声音像 0.5 秒一样迟到了。我希望在警报即将解除时立即发出声音,而不是解除后发出声音。使用 UIAlertView 可以使用 alertWillDismiss... 而不是 alertDidDismiss 来处理。

我错过了什么?

4

3 回答 3

3

不,你没有错过任何东西。UIAlertController 不提供您正在寻找的功能。考虑提供您自己的呈现视图控制器,您将拥有您所追求的那种精细控制。

于 2016-02-17T03:38:03.610 回答
2

我使用了 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)
    }
}
于 2016-04-23T18:33:25.133 回答
-1

有点骇人听闻,但也许你可以

  1. 尝试获取对警报按钮的引用(通过遍历 -admittedly private-view 层次结构树),并且
  2. 使用 KVO 来检测对其selected和/或highlighted属性的任何更改(我自己的经验是这selected不是可靠地可观察的,而highlighted确实是)。

...但是所有这些都非常脆弱,不优雅,可能会在操作系统的未来版本中中断和/或让您被应用商店拒绝...?

所以你最好的选择(即使最费力)是滚动你自己的模态视图控制器:

于 2016-02-17T03:51:14.063 回答