如何合并Text与TextField实现旁白支持并保留TextField特性?
解决CustomTextField合并辅助元素后丢失双击编辑特性的问题
我自定义了CustomTextField结构体,通过.accessibilityElement(children: .combine)让VoiceOver同时朗读标题文本和输入框内容,但这么做后,原本TextField自带的「双击以编辑」辅助功能特性消失了。除了手动添加accessibilityHint,有没有更优的解决方案?
原代码如下:
struct CustomTextField<F: ParseableFormatStyle>: View where F.FormatOutput == String { let title: String var value: Binding<F.FormatInput?> let format: F var body: some View { VStack(spacing: 6) { Text(title) .frame(maxWidth: .infinity, alignment: .leading) TextField("", value: value, format: format) .autocorrectionDisabled() } .accessibilityElement(children: .combine) // .accessibilityHint("Double tap to edit") // Is this the only way? } }
最优解决方案:利用accessibilityLabel关联标题,保留原生交互特性
不需要合并辅助元素,而是将标题文本设为TextField的辅助标签,同时隐藏标题自身的辅助元素。这样既可以让VoiceOver完整朗读标题+输入内容,又能完全保留TextField原生的辅助功能(包括默认的「双击以编辑」提示)。
修改后的代码:
struct CustomTextField<F: ParseableFormatStyle>: View where F.FormatOutput == String { let title: String var value: Binding<F.FormatInput?> let format: F var body: some View { VStack(spacing: 6) { Text(title) .frame(maxWidth: .infinity, alignment: .leading) .accessibilityHidden(true) // 隐藏标题自身的辅助元素,避免单独被VoiceOver选中 TextField("", value: value, format: format) .autocorrectionDisabled() .accessibilityLabel(title) // 将标题设为输入框的辅助标签,VoiceOver会先读标签再读输入内容 } } }
原理说明
使用.accessibilityElement(children: .combine)会将父视图打包成一个独立的辅助元素,子元素的原生辅助功能特性(比如TextField的交互提示、双击编辑动作)会被系统覆盖,因为此时子元素不再被识别为独立的可交互辅助单元。而通过accessibilityLabel关联标题的方式,既实现了内容的连贯朗读,又保留了TextField作为可交互辅助元素的所有原生特性,是更符合系统辅助功能设计逻辑的方案。
内容的提问来源于stack exchange,提问作者Jacob Jidell
相关产品推荐
相关产品推荐

