首页 文章

NSTextField可访问性 - 如何为画外音提供备用文本

提问于
浏览
3

这可能是显而易见的,但我之前从未做过NSAccessibility的任何工作,所以我假设我所要求的是一些我忽略的简单 .

我有一个NSTextField显示这样的持续时间,15:39 . 此文本字段是基于视图的NSTableView中NSTableCellView的子视图 .

当VoiceOver启用时,它当前会读取“一个五,三九”,这似乎完全没用 . 相反,我希望它说“持续时间是15分39秒 . ”

我可以生成所需的字符串,但我无法弄清楚我必须设置哪些可访问性属性才能实现 .

我已经尝试在IB中设置辅助功能描述,这无效(无论是在NSTextField还是NSTextFieldCell上设置) .

我还尝试重写 accessibilityValue:accessibilityAttributeValue:forParameter: ,以便为:提供自定义属性值:

  • NSAccessibilityNumberOfCharactersAttribute

  • NSAccessibilityStringForRangeParameterizedAttribute

  • NSAccessibilityAttributedStringForRangeParameterizedAttribute

  • NSAccessibilityStringForRangeParameterizedAttribute .

这似乎是正确的轨道,因为这确实允许我用声音替换大声朗读的内容,但是,为NSAccessibilityVisibleCharacterRangeAttribute提供任何NSRange与“15:39”字符串的长度不匹配会导致语音完全跳过这个字段在读取NSTableCellView的内容时 . 所以,我能做的最好的事情就是让Voice over说“Durat”而不是读“15:39”:(

我试过的一切,我都试过NSTextField和NSTextFieldCell .

理想情况下,我更喜欢做我在iOS中所做的事情,只需设置NSTableCellView的accessibilityLabel,但我认为在AppKit中没有合理的方法 . 希望我只是遗漏了一些东西 .

3 回答

  • 3

    我只需在NSTextField上设置accessibilityValueDescription即可实现此目的 . 此方法是OS X 10.10及更高版本上新的Accessibility API的一部分 . 使用较旧的API,您可以使用 kAXValueDescriptionAttribute 来实现相同的功能 .

  • 0

    我相信我已经回答了我自己的问题,至少足以控制点击表格单元格视图时读取的内容 .

    通过重写 accessibilityIsIgnored 以在我的NSTableCellView子类中返回"NO",我能够通过覆盖单元格的NSAccessibilityTitleAttribute来准确指定我想要读取表格单元格的内容 . 在b / c我误解了 accessibilityIsIgnored 选择器的目的之前,我没有尝试过这个 .

    accessibilityIsIgnored 的文档:

    当要求对象的孩子时,不应该包括被忽视的孩子;相反,被忽视的孩子应该被他们自己的未经教育的孩子所取代 .

    我希望能够准确控制将来为各个NSTextFields读取的内容,但控制整个NSTableCellView的读取内容实际上是我特定情况的理想选择 .

  • 0

    覆盖Voice Over读取的文本的解决方案比我想象的要简单得多 . 我所要做的就是覆盖为NSAccessibilityAttributedStringForRangeParameterizedAttribute返回的值:

    // The displayed text for this text field is "45m".
    // The voice over for this field incorrectly reads "forty five meters" instead of "forty five minutes".  
    // The following forces it to read "Duration forty five minutes"
    
    -(id)accessibilityAttributeValue:(NSString *)attribute forParameter:(id)parameter {
    return ([attribute isEqualToString:NSAccessibilityAttributedStringForRangeParameterizedAttribute])
            ? [[NSAttributedString alloc] initWithString:@"Duration: 45min"];
            : [super accessibilityAttributeValue:attribute forParameter:parameter];
    }
    

相关问题