UITextField:右视图可访问性(voiceOver)

Luc*_*ano 5 accessibility uitextfield ios voiceover

我在UITextField的右视图中添加了两个UIButton,但是voiceOver看不到它们(它“仅读取”包含的视图)。我已经将右视图的accessibilityElementsHidden设置为“否”。我不明白我在做什么错...

编辑:我子类化UITextField,可以与此相关吗?

And*_*lva 1

// MARK: - VoiceOver handling
extension MyTextField {
    public var voiceOverElements: [UIAccessibilityElement] {
        guard UIAccessibility.isVoiceOverRunning else {
            return []
        }
        let element: UIAccessibilityElement = UIAccessibilityElement(accessibilityContainer: self)
        let rect: CGRect = UIAccessibility.convertToScreenCoordinates(frame, in: self)
        element.accessibilityFrame = rect
        var result: [UIAccessibilityElement] = subviews.filter { $0 is UIButton }
            .map {
                let element: UIAccessibilityElement = UIAccessibilityElement(accessibilityContainer: self)
                let rect: CGRect = UIAccessibility.convertToScreenCoordinates($0.frame, in: self)
                element.accessibilityFrame = rect
                return element
            }
        result.insert(element, at: 0)
        return result
    }

    public override class func isAccessibilityElement() -> Bool {
        false
    }

    public override func accessibilityElement(at index: Int) -> Any? {
        voiceOverElements[index]
    }

    public override func accessibilityElementCount() -> Int {
        voiceOverElements.count
    }

    public override func index(ofAccessibilityElement element: Any) -> Int {
        guard let element = element as? UIAccessibilityElement,
              let toRet = voiceOverElements.firstIndex(of: element) else {
            return 0
        }
        return toRet
    }
}
Run Code Online (Sandbox Code Playgroud)

您应该重写 UIAccessibleContainer 方法以获得子视图可访问的框架。在本例中,我只获得按钮,但您可以忽略它。