如何实现Touch Accommodations与simultaneousGesture兼容适配
SwiftUI 适配Touch Accommodations(触控调节)异常解决方案
核心问题根因
Touch Accommodations的Hold Duration(按住持续时间)是系统级触控拦截逻辑,会在设定时长后才将触控事件抛给App响应链,SwiftUI原生手势、系统控件的默认触控逻辑全部基于App层收到的事件计时,因此会出现识别失效、超时逻辑提前触发的问题。.accessibilityHidden(true)仅作用于VoiceOver读屏逻辑,完全不影响触控调节的事件拦截,添加后不会产生任何效果。
单个Image控件手势失效修复方案
- 弃用SwiftUI原生的
highPriorityGesture、simultaneousGesture封装,原生手势完全受系统触控调节拦截,当设置的Hold Duration大于手势的最短触发阈值时(比如示例代码中配置的1秒长按、三击Tap手势,遇上2秒的Hold Duration设置时),手势永远无法满足触发条件。 - 将Image通过
UIViewRepresentable包装为自定义UIView,在自定义View上直接挂载UIGestureRecognizer,同时将手势的delaysTouchesBegan、delaysTouchesEnded、cancelsTouchesInView属性全部设为false,重写touchesEstimatedPropertiesUpdated方法直接忽略系统注入的触控延迟预估属性,基于原始触控流做手势识别,绕开SwiftUI层的辅助功能手势拦截。 - 原失效代码参考:
image .simultaneousGesture(LongPressGesture(minimumDuration:1).onEnded { _ in // 长按触发业务逻辑 }) .highPriorityGesture(TapGesture(count: 3).onEnded { _ in // 三击触发业务逻辑 })
注意:苹果没有开放公开API用于标记单个UI元素跳过触控调节约束,所有基于公开API的可行方案都是通过自定义响应层捕获原始触控事件实现,不要尝试修改accessibility相关属性实现该需求,没有实际效果。
PIN码输入框、AVPlayer控件提前消失修复方案
- 两类控件异常的核心逻辑一致:控件的自动消失/隐藏倒计时依赖App层感知到的最后触控时间,系统触控调节导致App收到触控事件的时间晚于用户实际操作时间,最终倒计时提前走完,控件提前消失。
- PIN码输入阶段适配方案:
- 不要依赖系统键盘、输入框的原生触控回调重置消失倒计时,通过UIWindow的hitTest方法添加全局原始触控监听,只要用户触碰屏幕就立即重置倒计时,不受系统事件传递延迟影响。
- 可通过
UIAccessibility相关公开属性读取当前系统触控调节的Hold Duration配置值,在检测到该功能开启时,将输入框的自动消失时长在原基础上增加对应的Hold Duration值,做逻辑适配,该方案完全符合App Store审核规则。 - 系统键盘没有公开API支持单独跳过触控调节,不要尝试修改系统键盘属性或调用私有API,会直接导致审核被拒。
- AVPlayer播放控件适配方案:
弃用AVPlayerViewController默认的播放控件和自动隐藏逻辑,使用自定义播放控件,自行维护控件隐藏倒计时,倒计时重置逻辑同样基于底层原始触控事件触发,不要依赖原生手势回调。
内容的提问来源于stack exchange,提问作者Giribabu
相关产品推荐
相关产品推荐

