XCUITest问题:设置按钮accessibilityFrame致其不可点击且不可用
我之前也踩过这个一模一样的坑!设置accessibilityFrame后按钮突然变成不可访问的状态,大概率是这几个地方没处理对:
坐标系搞混了是重灾区
别直接把按钮的frame赋值给accessibilityFrame!前者是相对于父视图的局部坐标,而accessibilityFrame要求的是屏幕坐标系下的矩形区域。你需要把按钮的bounds转换成屏幕坐标,比如用这个代码:// 把按钮的本地坐标转换成屏幕坐标 let screenFrame = self.linkButton.convert(self.linkButton.bounds, to: nil) self.linkButton.accessibilityFrame = screenFrame设置时机不对导致frame无效
如果在viewDidLoad里设置accessibilityFrame,这时候视图还没完成布局,按钮的实际位置和尺寸可能还没确定,导致无障碍框架拿到的是错误的区域。建议把设置代码移到viewDidLayoutSubviews里,或者在布局更新完成后再调用:override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 在这里设置accessibilityFrame let screenFrame = self.linkButton.convert(self.linkButton.bounds, to: nil) self.linkButton.accessibilityFrame = screenFrame self.linkButton.isAccessibilityElement = true }父视图的无障碍属性干扰
如果按钮的父视图被设置了isAccessibilityElement = true,那么父视图会被当作一个独立的无障碍元素,它的子视图会被自动隐藏,不再单独暴露给无障碍框架。这时候要么把父视图的isAccessibilityElement设为false,要么把按钮加入父视图的accessibilityElements数组:// 方案1:关闭父视图的无障碍元素属性 parentView.isAccessibilityElement = false // 方案2:把按钮加入父视图的无障碍元素列表 parentView.accessibilityElements = [self.linkButton]手动强制设置isAccessibilityElement
有时候设置accessibilityFrame可能会触发系统内部的逻辑,意外把isAccessibilityElement重置为false。所以在设置完frame后,一定要手动显式设置一遍:self.linkButton.accessibilityFrame = screenFrame self.linkButton.isAccessibilityElement = true // 别忘了加上无障碍标签,让自动化工具和辅助功能能识别 self.linkButton.accessibilityLabel = "跳转链接按钮"
先试试坐标系转换的方案,这是最常见的原因,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者Craig Fisher

