没有获得 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 方法没有获得事务