ios:如何检测语音听写是否用于UITextField?或者在键盘上轻敲麦克风按钮

时间:2015-09-18 13:05:03

标签: ios iphone uiview keyboard voice-recognition

如何检测UITextField是否使用了语音听写?或者在键盘上轻敲麦克风按钮。 有没有办法做到这一点?

enter image description here

2 个答案:

答案 0 :(得分:5)

UITextField符合UITextInput Protocol (在“使用听写”部分下是感兴趣的方法)。 在此协议中,您可以覆盖 dictationRecordingDidEnd 方法。

一种方法是继承 UITextField 并实施上述方法以及 UITextInput 协议中感兴趣的任何其他方法。

示例子类 .h

styles/admin

<强>的.m

#import <UIKit/UIKit.h>

@interface BWDictationTextField : UITextField

@end

不幸的是,没有记录的方法来检测麦克风按钮的实际敲击(听写确实开始)。

答案 1 :(得分:0)

当文本输入更改(包括听写开始和停止时)时,文本字段将报告更改。我们可以听取此通知并在听写开始和停止时进行报告。

这里是使用此技术的 Swift 子类。

protocol DictationAwareTextFieldDelegate: class {
    func dictationDidEnd(_ textField: DictationAwareTextField)
    func dictationDidFail(_ textField: DictationAwareTextField)
    func dictationDidStart(_ textField: DictationAwareTextField)
}

class DictationAwareTextField: UITextField {

    public weak var dictationDelegate: DictationAwareTextFieldDelegate?
    private var lastInputMode: String?
    private(set) var isDictationRunning: Bool = false

    override func dictationRecordingDidEnd() {
        isDictationRunning = false
        dictationDelegate?.dictationDidEnd(self)
    }

    override func dictationRecognitionFailed() {
        isDictationRunning = false
        dictationDelegate?.dictationDidEnd(self)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    private func commonInit() {
        NotificationCenter.default.addObserver(self, selector: #selector(textInputCurrentInputModeDidChange), name: .UITextInputCurrentInputModeDidChange, object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    @objc func textInputCurrentInputModeDidChange(notification: Notification) {
        guard let inputMode = textInputMode?.primaryLanguage else {
            return
        }

        if inputMode == "dictation" && lastInputMode != inputMode {
            isDictationRunning = true
            dictationDelegate?.dictationDidStart(self)
        }
        lastInputMode = inputMode
    }
}

当此类侦听通知时,如果有许多DictationAwareTextFields,则该通知将被多次调用。如果这是一个问题,则必须将通知观察代码从textField中移到更高的类中,例如视图控制器。