当我的应用程序的所有用户执行某些操作时,我需要向他们宣布一些文本。为此,我使用AVSpeechSynthesizer
. 这很好用,除非您使用 VoiceOver 来执行操作。因为 VoiceOver 是在向用户公布一些系统提供的信息AVSpeechUtterance
,所以同时播放 my,所以声音是重叠的。如何将我的语音进行排队,以便在 VoiceOver 完成讲话后才播放它?
问问题
816 次
3 回答
4
您可以通过观察 VoiceOver 活动来实现这一点。首先添加一个 Voiceover 通知观察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(voiceOverDidStop:) name:UIAccessibilityAnnouncementDidFinishNotification object:nil];
然后,在指定的方法中:
-(void)voiceOverDidStop:(NSNotification*)n {
NSString* msg;
NSNumber* finished;
msg = [[n userInfo] objectForKey:UIAccessibilityAnnouncementKeyStringValue];
finished = [[n userInfo] objectForKey:UIAccessibilityAnnouncementKeyWasSuccessful];
if(finished) {
// send the AVSpeechSynthsizer message
}
}
请记住在处理您的应用程序之前删除观察!
您可以使用的另一种方法(如果适用)是编辑用户正在使用的对象的accessibilityLabel
和属性。accessibilityHint
将这些属性设置为,@""
以便 VoiceOver 知道该对象无话可说。
希望这对您有所帮助,即使我的回答来晚了:)
于 2015-11-01T09:13:29.637 回答
1
检查 VoiceOver 是否正在运行,并UIAccessibilityAnnouncementNotification
与您的消息一起发布,而不是使用AVSpeechSynthesizer
.
于 2015-03-29T02:07:24.977 回答
0
我已经完成了这个asyncAfter
,代码是 SwiftUI,但我希望你明白:
Button {
if !UIAccessibility.isVoiceOverRunning {
readOutLoud(translation)
}
} label: {
Image(systemName: "speaker.wave.3.fill")
}
.accessibilityElement()
.accessibilityLabel("Listen")
.accessibilityAction {
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
readOutLoud(translation)
})
}
当按下按钮且 VoiceOver 未激活时,该按钮会读取文本。
当 VoiceOver 被激活时,文本将以accessibilityAction
所需的延迟阅读。
于 2021-06-30T20:03:31.083 回答