4

おそらく明らかでしょうが、私は以前に NSAccessibility で作業をしたことがないので、私が求めているのは私が見落としている単純なものであると想定しています。

15:39 のような期間を表示する NSTextField があります。このテキスト フィールドは、ビューベースの NSTableView 内の NSTableCellView のサブビューです。

VoiceOver を有効にすると、現在は「ワン ファイブ、スリー ナイン」と読み上げられますが、これはまったく役に立たないようです。代わりに、「所要時間は 15 分 39 秒です」と表示してもらいたいのです。

目的の文字列を生成できますが、これを実現するためにどのアクセシビリティ属性を設定する必要があるかわかりません。

IB でアクセシビリティの説明を設定しようとしましたが、効果はありません (NSTextField または NSTextFieldCell で設定しても)。

また、次のカスタム属性値を提供するために、 accessibilityValue :accessibilityAttributeValue:forParameter:をオーバーライドしようとしました。

  • NSAccessibilityNumberOfCharactersAttribute
  • NSAccessibilityStringForRangeParameterizedAttribute
  • NSAccessibilityAttributedStringForRangeParameterizedAttribute
  • NSAccessibilityStringForRangeParameterizedAttribute。

ナレーションで読み上げられるものを置き換えることができるため、これは正しいトラックのように見えましたが、「15:39」文字列の長さと一致しない NSAccessibilityVisibleCharacterRangeAttribute に NSRange を指定すると、ナレーションが完全にスキップされます。 NSTableCellView のコンテンツを読み取るときのこのフィールド。だから、私ができる最善のことは、「15:39」を読み上げる代わりに、ボイスオーバーに「Durat」と言うようにすることです:(

私が試したことはすべて、NSTextFieldとNSTextFieldCellで試しました。

理想的には、iOS で行うことを行い、NSTableCellView の accessibilityLabel を設定するだけでよいのですが、AppKit でこれを行う合理的な方法はありません。うまくいけば、私は何かが足りないだけです。

4

3 に答える 3

1

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];
}
于 2013-04-27T15:18:19.240 に答える
0

少なくとも、テーブル セル ビューをクリックしたときに読み取られる内容を制御するのに十分な、自分自身の質問に答えたと思います。

NSTableCellView サブクラスで「NO」を返すようにaccessibilityIsIgnoredをオーバーライドすることで、セルの NSAccessibilityTitleAttribute をオーバーライドすることで、テーブル セルの何を読み上げるかを正確に指定することができました。私はアクセシビリティIsIgnoredセレクターの目的を誤解する前にこれを試していませんでした。

accessibilityIsIgnoredのドキュメントから:

オブジェクトの子を要求する場合、無視された子を含めることはできません。代わりに、無視された子を無視されていない独自の子に置き換える必要があります

将来的には、個々の NSTextField に対して読み取られるものを正確に制御できるようにしたいと考えていますが、NSTableCellView 全体に対して読み取られるものを制御することは、実際には私の特定の状況にとって理想的です。

于 2013-04-26T00:27:39.507 に答える