簡體   English   中英

如何在MacOS上實現可供VoiceOver訪問的NSSlider?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM