You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIKit中是否存在API让UIView自动合并子视图的无障碍属性?

UIKit 中是否有类似 SwiftUI accessibilityElement(children: .combine) 的自动无障碍组合 API?

我的视图层级结构如下:

UIView
  \-- UIStackView
    +-- UILabel
    \-- UILabel

默认情况下,VoiceOver 会跳过外层的 UIView,分别停留在每个 UILabel 上读取内容。我希望 VoiceOver 能停在这个 UIView 上,自动依次读取每个可访问子视图的无障碍标签。

我已经知道可以将 UIView 的 isAccessibilityElement 设为 true,并手动拼接 accessibilityLabel,但想了解是否存在无需手动维护的自动实现方式,类似 SwiftUI 中的 accessibilityElement(children: .combine)。


UIKit 提供了两种无需手动拼接标签的自动实现方式,适配不同的 iOS 版本:

iOS 14+:使用 accessibilityChildren 属性

iOS 14 及以上新增了 accessibilityChildren 属性,可以直接指定父视图的无障碍子元素集合。系统会自动将这些子元素的无障碍内容合并,VoiceOver 会将父视图作为单个元素,依次读取所有子元素的标签:

// 假设 parentView 是外层的 UIView,label1、label2 是两个 UILabel
parentView.isAccessibilityElement = true
parentView.accessibilityChildren = [label1, label2]

iOS 13 及以下:实现 UIAccessibilityContainer 协议

对于更早的系统版本,可以通过实现 UIAccessibilityContainer 协议来让父视图作为无障碍容器,自动合并子元素的内容:

class AccessibleContainerView: UIView, UIAccessibilityContainer {
    // 关联子视图(根据实际场景初始化)
    private let label1: UILabel
    private let label2: UILabel
    
    override var isAccessibilityElement: Bool {
        get { true }
        set { } // 禁止外部修改,确保容器作为单个无障碍元素
    }
    
    // 返回容器内的无障碍元素数量
    override func accessibilityElementCount() -> Int {
        2
    }
    
    // 返回指定索引对应的无障碍元素
    override func accessibilityElement(at index: Int) -> Any? {
        index == 0 ? label1 : label2
    }
    
    // 返回指定元素在容器中的索引
    override func index(ofAccessibilityElement element: Any) -> Int {
        switch element {
        case label1: return 0
        case label2: return 1
        default: return NSNotFound
        }
    }
}

以上两种方式都能让 VoiceOver 将父视图识别为单个无障碍元素,自动依次读取子视图的无障碍标签,无需手动维护拼接后的文本。


内容的提问来源于stack exchange,提问作者Adil Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:05:31