没有获得 UIAccessibilityElement 的正确坐标

Posted

技术标签:

【中文标题】没有获得 UIAccessibilityElement 的正确坐标【英文标题】:Not getting right coordinates for UIAccessibilityElement 【发布时间】:2018-05-09 17:57:25 【问题描述】:

我正在尝试使用我的标签对我的按钮进行分组,但没有在正确的位置获得可访问性的矩形。

一直滑动到元素后,它需要正确的宽度和高度,但 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]

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我有一个StackView,它有两个IBOutlets(比如说一个title和一个value)。而且我已经苦苦挣扎了几个月,无法弄清楚为什么我的容器找不到框架的正确位置(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
    

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于没有获得 UIAccessibilityElement 的正确坐标的主要内容,如果未能解决你的问题,请参考以下文章

从另一个方法调用的@Transactional 方法没有获得事务

没有获得 UIAccessibilityElement 的正确坐标

标签没有获得价值

UIActionSheetdelegate 没有获得子视图

为啥没有滚动条我无法获得容器宽度?

为啥 TS 没有从 Interface 获得 React 状态断言?