语音通过无法正确读取电话号码

时间:2014-02-14 09:00:53

标签: ios objective-c accessibility voiceover wcag

我有以下格式的电话号码

1-1xx-2XX-9565

目前VO将其视为“一个(暂停)一个xx (暂停)两个xx (暂停)减去九千五百六十五“。

VO应将其读作“一个(暂停)一个xx (暂停)两个xx (暂停)九五六5 ”。

可能是什么问题?这是错误的电话格式吗?

5 个答案:

答案 0 :(得分:10)

让我们分解正在发生的事情。 VoiceOver不知道您呈现的文本是电话号码,并将其视为文本句子。在该文本中,它试图找到不同的组件并适当地读取它们。例如,文本"buy 60 cantaloupes"有3个组件,“买”,“60”和“哈密瓜”。第一个是文本,读作文本,第二个是纯数字,最好读作“六十”,第三个读作文本。

将相同的逻辑应用于您的电话号码。

(我不是在谈论实际的实施,只是推理。)

如果您从左到右阅读 1-1xx-2xx-9565 ,则第一个不同的组件为“1”,其中自身为数字并且读为“1”。如果电话号码以“12-1xx”开头,则第一个组件将被读作“十二”,因为它纯粹是数字。

下一个组件是“1xx”或“-1xx”,具体取决于您如何看待它。在任何一种情况下,它都是数字和字母的组合,例如它不是纯粹数字,因此作为文本读出。如果在该组件中包含“ - ”,则将其解释为未读出的连字符。这就是为什么永远不会读出该组件的“ - ”。下一个组件(“-2xx”)以相同的方式处理。

最后一个组件是“-9565”,结果证明是有效数字。正如哈密瓜句子所示,VoiceOver将其读作数字,在这种情况下,“ - ”不再被解释为连字符,而是“减号”。

让VoiceOver阅读您自己的文字

在应用程序中与Voice Over一起使用的任何标签,视图或其他元素上,当您了解有关如何阅读文本的更多信息时,可以提供自己的“辅助功能标签”。只需将您自己的字符串分配给accessibilityLabel属性即可完成此操作。

现在,您可以通过多种不同方式创建合适的字符串,在您的情况下,非常简单的方法是在任何地方添加空格,以便单独读取每个数字。但是,它对我来说似乎有点脆弱,所以我继续使用数字格式器将各个数字翻译成文本表示。

NSString *phoneNumber = @"1-1xx-2xx-9565";

// we want to know if a character is a number or not
NSCharacterSet *numberCharacters = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

// we use this formatter to spell out individual numbers
NSNumberFormatter *spellOutSingleNumber = [NSNumberFormatter new];
spellOutSingleNumber.numberStyle = NSNumberFormatterSpellOutStyle;

NSMutableArray *spelledOutComonents = [NSMutableArray array];
// loop over the phone number add add the accessible variants to the array
[phoneNumber enumerateSubstringsInRange:NSMakeRange(0, phoneNumber.length)
                                options:NSStringEnumerationByComposedCharacterSequences
                             usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                 // check if it's a number
                                 if ([substring rangeOfCharacterFromSet:numberCharacters].location != NSNotFound) {
                                     // is a number
                                     NSNumber *number = @([substring integerValue]);
                                     [spelledOutComonents addObject:[spellOutSingleNumber stringFromNumber:number]];
                                 } else {
                                     // is not a number
                                     [spelledOutComonents addObject:substring];
                                 }
                             }];
// finally separate the components with spaces (so that the string doesn't become "ninefivesixfive".
NSString *yourAccessiblePhoneNumber = [spelledOutComonents componentsJoinedByString:@" "];

我跑步时的结果是

one - one x x - two x x - nine five six five

如果您需要对手机号码进行其他修改以使其正确阅读,那么您可以这样做。我怀疑你会在你的应用程序中使用它不止一个位置,所以创建一个自定义的NSFormatter可能是一个好主意。


修改

在iOS 7上,您还可以使用属性字符串上的UIAccessibilitySpeechAttributePunctuation属性来更改其发音方式。

  

归属字符串的语音属性

     

您可以应用于属性字符串中的文本以修改该文本发音方式的属性。

     

UIAccessibilitySpeechAttributePunctuation

     

此键的值是NSNumber对象,您应将其解释为布尔值。当值为YES时,会说出文本中的所有标点符号。您可以将此用于标点符号相关的代码或其他文本。

     

适用于iOS 7.0及更高版本。

     

UIAccessibilityConstants.h

中声明

答案 1 :(得分:0)

如果您想单独拼写所有字符,一个简单的解决方案是用逗号分隔字符","。

您可以使用String扩展名转换字符串:

extension String
{
    /// Returns string suitable for accessibility (voice over). All characters will be spelled individually.
    func stringForSpelling() -> String
    {
        return stringBySeparatingCharactersWithString(",")
    }


    /// Inserts a separator between all characters
    func stringBySeparatingCharactersWithString(separator: String) -> String
    {
        var s = ""
        // Separate all characters
        let chars = self.characters.map({ String($0) })

        // Append all characters one by one
        for char in chars {
            // If there is already a character, append separator before appending next character
            if s.characters.count > 0 {
                s += separator
            }
            // Append next character
            s += char
        }

        return s
    }
}

然后在代码中使用它:

myLabel.accessibilityLabel = myString.stringForSpelling()

答案 2 :(得分:0)

只需在最后一个数字的每个数字上添加一个逗号,也可以在最后一个数字后面添加逗号。这将确保语音翻转读取与前一个数字相同的最后一个数字。

示例您的电话号码: - 1-1xx-2xx-9565 可访问性标签: - 1-1xx-2xx-9,5,6,5,

答案 3 :(得分:0)

从iOS 13开始,您可以使用-NSAttributedString.Key.accessibilitySpeechSpellOut作为accessibilityAttributedLabel,以使VoiceOver读取提供的字符串(或字符串范围)的每个字母。

例如:

yourView.accessibilityAttributedLabel = NSAttributedString(string: yourText, attributes: [.accessibilitySpeechSpellOut: true])

答案 4 :(得分:-1)

这是Swift中的代码

EXEC xp_cmdshell @cmd