Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在MacOS上为VoiceOver实现NSSlider访问?_Swift_Macos_Accessibility_Voiceover - Fatal编程技术网

Swift 如何在MacOS上为VoiceOver实现NSSlider访问?

Swift 如何在MacOS上为VoiceOver实现NSSlider访问?,swift,macos,accessibility,voiceover,Swift,Macos,Accessibility,Voiceover,我有一个slider:NSSlider和valueLabel:NSTextField,我想知道怎样才能让VoiceOver用户访问它 首先,我将slider的发送操作连接到sliderChanged函数以更新valueLabel valueLabel.stringValue = String(slider.integerValue) 画外音正确读取标签,但它以百分比形式读取滑块。为了解决这个问题,我将sliderChanged函数更改为setAccessibilityValueDescript

我有一个slider:NSSlider和valueLabel:NSTextField,我想知道怎样才能让VoiceOver用户访问它

首先,我将slider的发送操作连接到sliderChanged函数以更新valueLabel

valueLabel.stringValue = String(slider.integerValue)
画外音正确读取标签,但它以百分比形式读取滑块。为了解决这个问题,我将sliderChanged函数更改为setAccessibilityValueDescription

slider.setAccessibilityValueDescription(String(slider.integerValue))
现在VoiceOver正确读取滑块的值。但是,它可以同时看到valueLabel和slider,因此它是冗余的

我尝试了valueLabel.setAccessibilityElement(false),但画外音似乎并没有忽略


有人能告诉我什么是正确的实施方法吗?谢谢

最好的方法是创建一个包含标签和滑块的自定义“ContainerView”类(从UIView继承),使ContainerView成为accessibilityElement,并将其accessibilityTraits设置为“可调”。通过创建一个同时包含valueLabel和滑块的ContainerView,您可以删除当前实现中存在的冗余,同时不影响非VoiceOver用户的slider/valueLabel的布局或可用性。这个答案是基于,所以如果有什么不清楚或者你想要更深入的信息,请观看视频

将视图的UIAccessibilityTraits设置为“可调整”允许您使用其函数AccessibilityCrement和AccessibilityCrement,以便可以根据需要更新任何内容(滑块、文本字段等)。这种特性使任何视图都可以像典型的可调视图一样工作(无需添加UIgestureRecognitor或附加画外音公告)

为了方便起见,我在下面发布了我的代码,但它主要基于我上面链接的视频。(我个人是一名iOS开发人员,因此我的Swift代码基于iOS)

注意——我必须重写“accessibilityValue”变量——这是为了让VoiceOver在用户上下滑动时宣布滑块中的更改

My 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()
    }
}
希望这有帮助