首页 文章

如何使任意UIAccessibilityElement的行为类似于VoiceOver的UISwitch?

提问于
浏览
1

使用VoiceOver选择本机开关时,通知将包含“关闭”或“开启”,并附加提示“双击以切换设置” .

我已经尝试使用辅助功能特性 UIAccessibilityTraitSelected ,但这只会导致"Selected"被宣布,没有提示,除非我明确提供一个 .

使用辅助功能检查器我还注意到,启用时,本机UIKit交换机的accessibilityValue为 1 ,但提供的不会改变VoiceOver行为 .

- (UIAccessibilityTraits)accessibilityTraits {
  if (toggled) {
    return UIAccessibilityTraitSelected;
  } else {
    return UIAccessibilityTraitNone;
  }
}

- (NSString*)accessibilityValue {
  if (toggled) {
    return @"1";
  } else {
    return @"0"
  }
}

是否可以提供特征/值/标签的某种组合,以便TalkBack将此元素识别为Switch,而不使用UISwitch?

2 回答

  • 1

    您可以创建一个自定义辅助功能元素,其行为类似于UISwitchControl,可以随心所欲 . 唯一需要指出的是VoiceOver应该解释它的方式 .

    假设你想收集 labelview 被视为一个开关控件 .

    首先, create a class for grouping these elements 成一个:

    class WrapView: UIView {
    
    static let defaultValue = "on"
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    
    convenience init(with label: UILabel,and view: UIView) {
    
        let viewFrame = label.frame.union(view.frame)
        self.init(frame: viewFrame)
    
        self.isAccessibilityElement = true
        self.accessibilityLabel = label.accessibilityLabel
        self.accessibilityValue = WrapView.defaultValue
        self.accessibilityHint = "element is" + self.accessibilityValue! + ", tap twice to change the status."
    }
    }
    

    然后,在你的 viewDidAppear() 中只需 create your custom view

    class ViewController: UIViewController {
    
    @IBOutlet weak var myView: UIView!
    @IBOutlet weak var myLabel: UILabel!
    
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        let myCustomView = WrapView.init(with: myLabel, and: myView)
    
        self.view.addSubview(myCustomView)
    }
    }
    

    最后,要使自定义视图像开关控件一样,只需覆盖 WrapView 类中的 accessibilityActivate 函数,即可在双击视图时实现逻辑:

    override func accessibilityActivate() -> Bool {
    
        self.accessibilityValue = (self.accessibilityValue == WrapView.defaultValue) ? "off" : "on"
        self.accessibilityHint = "element is" + self.accessibilityValue! + ", tap twice to change the status."
    
        return true
    }
    

    现在你有了一个自定义元素,它包含你想要的任何东西,对于使用VoiceOver而不使用UISwitch的盲人来说,它就像一个开关控件 .

  • 4

    我创建了一个可访问的视图,其作用类似于交换机here .

    在继承Switch的UIAccessibilityTraits时,我能够让任意元素像Switch一样工作的唯一方法 . 这会导致VoiceOver读取辅助功能值( 01 )为"Off"或"On,"添加提示"Double tap to toggle setting",并使VoiceOver说"Switch Button."

    您可以通过覆盖视图的辅助功能特性来执行此操作,如下所示:

    override var accessibilityTraits(): UIAccessibilityTraits {
        get { return UISwitch().accessibilityTraits }
        set {}
    }
    

    希望这可以帮助!

相关问题