Swift:如何让Label成为AccessibilityElement且不被VoiceOver朗读?
解决iOS Label既是AccessibilityElement又禁止VoiceOver朗读的问题
有两种可行方案能同时满足QA自动化测试和无障碍团队的要求:
方案1:设置accessibilityLabel为空字符串
VoiceOver会优先读取控件的accessibilityLabel值,将其设为空后,VoiceOver不会产生朗读内容,但控件依然是AccessibilityElement,QA团队可正常通过accessibilityIdentifier定位元素。
修改后的代码如下:
private let priceLabel: Text16Left = { let label = Text16Left() label.translatesAutoresizingMaskIntoConstraints = false label.numberOfLines = 0 label.isDynamicTypeEnabled = true label.isAccessibilityElement = true label.accessibilityIdentifier = AccessibilityIdentifiers.priceLabel // 阻止VoiceOver朗读的核心设置 label.accessibilityLabel = "" return label }()
方案2:自定义控件重写无障碍属性(进阶场景)
如果需要根据特定条件动态控制朗读状态,可以自定义Label类,重写accessibilityLabel计算属性返回空值:
class SilentTextLabel: Text16Left { override var accessibilityLabel: String? { get { return "" } set { /* 忽略外部对该属性的修改 */ } } } // 使用自定义类替代原Label private let priceLabel: SilentTextLabel = { let label = SilentTextLabel() label.translatesAutoresizingMaskIntoConstraints = false label.numberOfLines = 0 label.isDynamicTypeEnabled = true label.isAccessibilityElement = true label.accessibilityIdentifier = AccessibilityIdentifiers.priceLabel return label }()
注意:不要设置accessibilityElementsHidden = true,这会让元素完全从无障碍树中消失,导致QA自动化测试无法定位到该元素。
内容的提问来源于stack exchange,提问作者rainerwolfram
相关产品推荐
相关产品推荐

