没有获得 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
}
}
我正在尝试将我的按钮与我的标签分组,但没有在正确的位置获得用于辅助功能的矩形。
一直滑动到元素后,它的宽度和高度都是正确的,但 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
}
}