我有以下格式的电话号码
的 1-1xx-2XX-9565 的
目前VO将其视为“一个(暂停)一个xx (暂停)两个xx (暂停)减去九千五百六十五“。
VO应将其读作“一个(暂停)一个xx (暂停)两个xx (暂停)九五六5 ”。
可能是什么问题?这是错误的电话格式吗?
答案 0 :(得分:10)
让我们分解正在发生的事情。 VoiceOver不知道您呈现的文本是电话号码,并将其视为文本句子。在该文本中,它试图找到不同的组件并适当地读取它们。例如,文本"buy 60 cantaloupes"有3个组件,“买”,“60”和“哈密瓜”。第一个是文本,读作文本,第二个是纯数字,最好读作“六十”,第三个读作文本。
(我不是在谈论实际的实施,只是推理。)
如果您从左到右阅读 1-1xx-2xx-9565 ,则第一个不同的组件为“1”,其中自身为数字并且读为“1”。如果电话号码以“12-1xx”开头,则第一个组件将被读作“十二”,因为它纯粹是数字。
下一个组件是“1xx”或“-1xx”,具体取决于您如何看待它。在任何一种情况下,它都是数字和字母的组合,例如它不是纯粹数字,因此作为文本读出。如果在该组件中包含“ - ”,则将其解释为未读出的连字符。这就是为什么永远不会读出该组件的“ - ”。下一个组件(“-2xx”)以相同的方式处理。
最后一个组件是“-9565”,结果证明是有效数字。正如哈密瓜句子所示,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