![](/img/trans.png)
[英]How to Implement accessibilityCustomActions for VoiceOver on Mac?
[英]How to Implement NSSlider Accessible for VoiceOver on MacOS?
我有一個Slider:NSSlider和valueLabel:NSTextField,我想知道什么是使VoiceOver用戶可以訪問它的正確方法。
首先,我將滑塊的發送動作連接到sliderChanged函數以更新valueLabel。
valueLabel.stringValue = String(slider.integerValue)
VoiceOver會正確讀取標簽,但會以百分比讀取滑塊。 為了解決這個問題,我將sliderChanged函數更改為setAccessibilityValueDescription。
slider.setAccessibilityValueDescription(String(slider.integerValue))
現在,VoiceOver可以正確讀取滑塊的值。 但是,它同時看到valueLabel和滑塊,因此是多余的。
我嘗試使用valueLabel.setAccessibilityElement(false),但VoiceOver似乎並沒有忽略。
有人可以建議實施此方法的正確方法是什么? 謝謝!
最佳方法是創建一個自定義“ ContainerView”類(繼承自UIView),該類包含標簽和滑塊,將ContainerView設置為accessibilityElement,並將其accessibilityTraits設置為“ adjustable”。 通過創建同時包含valueLabel和滑塊的ContainerView,您可以刪除當前實現中存在的冗余,同時不影響非VoiceOver用戶的滑塊/ valueLabel的布局或可用性。 該答案基於此視頻 ,因此,如果不清楚或需要更多詳細信息,請觀看視頻!
將視圖的UIAccessibilityTraits設置為“可調整”,可以使用其功能accessibilityIncrement和accessibilityDecrement,以便可以更新所需的內容(滑塊,文本字段等)。 此特征使任何視圖都可以像典型的可調菜單一樣工作(無需添加UIGestureRecognizers或其他VoiceOver公告)。
為了方便起見,我在下面發布了我的代碼,但這很大程度上是基於我上面鏈接的視頻。 (我個人是iOS開發人員,因此我的Swift代碼基於iOS)
注意-我必須覆蓋“ accessibilityValue”變量-這是為了使每當用戶向上或向下滑動時VoiceOver都可以宣布滑塊中的更改。
我的ContainerView類包含以下代碼:
class ContainerView: UIView {
static let LABEL_TAG = 1
static let SLIDER_TAG = 2
var valueLabel: UILabel {
return self.viewWithTag(ContainerView.LABEL_TAG) as! UILabel
}
var slider: UISlider {
return self.viewWithTag(ContainerView.SLIDER_TAG) as! UISlider
}
override var accessibilityValue: String? {
get { return valueLabel.text }
set {}
}
override var isAccessibilityElement: Bool {
get { return true }
set { }
}
override var accessibilityTraits: UIAccessibilityTraits {
get { return UIAccessibilityTraitAdjustable }
set { }
}
override init(frame: CGRect) {
super.init(frame: frame)
valueUpdated()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
valueUpdated()
}
func valueUpdated() {
valueLabel.text = String(slider.value)
slider.sendActions(for: .valueChanged)
}
override func accessibilityIncrement() {
super.accessibilityIncrement()
slider.setValue(slider.value + 1, animated: true)
valueUpdated()
}
override func accessibilityDecrement() {
super.accessibilityDecrement()
slider.setValue(slider.value - 1, animated: true)
valueUpdated()
}
}
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.