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

iOS Swift中如何为VoiceOver设置展开与折叠状态?

iOS Swift端VoiceOver展开/折叠状态实现方案

以下是对应Android端AccessibilityNodeInfoCompat.ACTION_EXPAND、AccessibilityNodeInfoCompat.ACTION_COLLAPSE的等效实现:

  • 状态标识:通过UIAccessibilityTraits的.expanded、.collapsed枚举值标记控件当前的展开/折叠状态,VoiceOver会自动识别并朗读对应状态。
  • 交互响应:重写控件的accessibilityActivate()方法,处理VoiceOver用户触发的展开/折叠操作。
  • 状态同步:状态切换后发送无障碍通知告知VoiceOver更新信息,避免状态不同步。

完整代码示例

class CustomExpandableView: UIView {
    // 外部控制展开/折叠状态
    var isExpanded: Bool = false {
        didSet {
            updateAccessibilityConfig()
            // 此处添加你自己的UI展开/折叠动效逻辑
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupBaseAccessibility()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupBaseAccessibility()
    }
    
    // 基础无障碍配置
    private func setupBaseAccessibility() {
        isAccessibilityElement = true
        // 按需修改你的控件无障碍标签
        accessibilityLabel = "可展开内容面板"
    }
    
    // 更新无障碍状态
    private func updateAccessibilityConfig() {
        // 先移除旧的状态特征
        accessibilityTraits.remove([.expanded, .collapsed])
        if isExpanded {
            accessibilityTraits.insert(.expanded)
            accessibilityHint = "双击可折叠内容"
        } else {
            accessibilityTraits.insert(.collapsed)
            accessibilityHint = "双击可展开内容"
        }
        // 通知VoiceOver状态变更
        UIAccessibility.post(notification: .layoutChanged, argument: self)
    }
    
    // 响应VoiceOver双击交互
    override func accessibilityActivate() -> Bool {
        isExpanded.toggle()
        return true
    }
}

补充说明

  • 以上手动实现方案兼容iOS 11及以上系统版本
  • 如果使用iOS 14+ 系统自带的UICollectionViewListCell展开折叠能力,系统会自动完成无障碍状态的配置和同步,无需手动处理上述逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:06:03