【发布时间】:2021-04-15 21:03:04
【问题描述】:
现在了解到 UIStackView 的可访问性默认情况下会在语音开启时按顺序读取排列的子视图。假设我有这个层次结构:
UIView
- UIStackView
-view1
-view2
-view3
-view4
- collapsibleSpecialView
collapsibleSpecialView 锚定在 view4 的顶部:
etc
|------------------|
| view3 |
|------------------|
| collapsible | <- when collapsed overlaps with vw3 to vw1
|------------------|
| view4 |
|------------------|
我需要配音才能按上述顺序阅读我的元素。但是由于 stackView 需要首先完成其所有可访问的子视图,所以我的可折叠视图是最后读取的,但我需要在 view4 之前读取它。
我无法将它添加到 stackview,因为当 collapsibleView 折叠时,它会将所有内容推到上面。而且我不想破解自动布局来解决这个问题。
我认为可行的方法是在 view4 之前插入一个不可见的代理 UIView,并在该 ProxyView 中覆盖其 methods 以返回可访问的元素。
public class ProxyView: UIView {
private var view: UIView?
/// view is the collapsibleView
@objc public convenience init(view: UIView) {
self.init()
self.isAccessibilityElement = true
self.view = view
}
public override func accessibilityElementCount() -> Int {
return 1
}
public override func accessibilityElement(at index: Int) -> Any? {
guard let menu = view else { return nil }
return menu
}
public override func index(ofAccessibilityElement element: Any) -> Int {
return 0
}
}
有了这个画外音,可以在view4 之前读取我的 ProxyView,但由于某种原因它没有进入 collapsibleView,向右滑动会将焦点转移到 view4。
如果我对 UIAccessibilityContainer 的理解是正确的,理论上这应该可行,但事实并非如此。我错过了什么?谢谢
【问题讨论】:
标签: ios uistackview voiceover uiaccessibility