没有获得 UIAccessibilityElement 的正确坐标

Not getting right coordinates for UIAccessibilityElement

我正在尝试将我的按钮与我的标签分组,但没有在正确的位置获得用于辅助功能的矩形。

一直滑动到元素后,它的宽度和高度都是正确的,但 y 位置完全错误。它说的是正确的 VO,但我不知道为什么位置不正确。我有以下代码,

let checkboxAccessible = UIAccessibilityElement(accessibilityContainer: view)
let unionRect = passwordCheckbox.frame.union(showPasswordText.frame)
checkboxAccessible.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(unionRect, self.view)
checkboxAccessible.accessibilityLabel = NSLocalizedString("Show Password", comment: "showPasswordText")
view.accessibilityElements = [productTitle, leadInText, emailTextField, passwordTextField, checkboxAccessible, loginButton, forgotPasswordView, helpButton]

如有任何帮助,我们将不胜感激。

调试后我发现我犯了什么错误。上面提到的所有更改都在 ViewDidLoad 中,到那时我们还没有得到正确的框架。

所以我在 viewDidLayoutSubviews 中进行了这些更改,现在得到了正确的框架。

我遇到了同样的问题,我有一个 StackView,它有两个 IBOutlets(假设一个 title 和一个 )。而且我已经苦苦挣扎了几个月,想不通为什么我的容器找不到框架的正确位置(self.frame)。

最近回来解决这个问题的时候,看到Apple documenation他们用的是union()函数。我在我的案例中试用了它,效果非常好!

工作分组元素示例:

class CustomView: UIView {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var valueLabel: UILabel!
    
    private var _accessibilityElements: [Any]?
    override var accessibilityElements: [Any]? {
        set {
            _accessibilityElements = newValue
        }
        
        get {
            guard _accessibilityElements == nil else {
                return _accessibilityElements
            }
            
            var elements = [UIAccessibilityElement]()
            
            guard let titleText = titleLabel.text,
                let valueText = valueLabel.text else {
                    return elements
            }
            
            let latitudeElement = UIAccessibilityElement(accessibilityContainer: self)
            latitudeElement.accessibilityLabel = "\(titleText), \(valueText)"
            latitudeElement.accessibilityFrameInContainerSpace = titleLabel.frame.union(valueLabel.frame) // Before: "self.frame"
            elements.append(latitudeElement)
            _accessibilityElements = elements
            
            return _accessibilityElements
        }
    }
    
    func removeAccessibilityElements() {
        _accessibilityElements = nil
    }
}