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
相关产品推荐
相关产品推荐

