iOS 17中SwiftUI支持onScrollPhaseChange的水平选择器兼容问题求助
iOS 17中SwiftUI支持onScrollPhaseChange的水平选择器兼容问题求助
各位大佬好~我最近做了一个SwiftUI的水平选择器,已经搞定了几个核心功能:
- 选中项始终保持居中(哪怕是列表的第一个或最后一个项)
- 点击任意项就能将其设为选中状态
- 支持拖拽滚动,滚动停止时,会自动选中最靠近中心的项
结果碰到个头疼的问题:这个选择器在iOS17上完全跑不起来!我试过用同时手势(simultaneous gestures)来解决冲突,但根本没用。有没有大佬能给我支个招呀?
可能的解决方向建议:
- 试试iOS17原生的滚动定位方案:直接用
ScrollView(.horizontal)搭配scrollTargetLayout()和scrollPosition(id: $selectedItemId),系统会自动帮你处理选中项居中、停止滚动时定位最近项,点击选中也能原生支持,完全不用自己写手势,从根源上避免手势冲突的问题。我之前用这个替代自定义手势后,iOS17上的兼容性立马就好了。 - 调整手势优先级:如果非得保留自定义手势逻辑,试试给拖拽手势加上
.highPriorityGesture(),或者给点击、拖拽手势都配置.simultaneousGesture(),但要注意添加顺序——iOS17对手势的识别顺序管控更严格,可能需要把你的自定义手势放在系统滚动手势之后处理。 - 分离滚动状态与选择逻辑:如果之前依赖
onScrollPhaseChange监听滚动结束,试试换成在ScrollPhase.idle状态触发时,通过GeometryReader获取每个选项的位置信息,手动计算出最靠近屏幕中心的选项,再将其设为选中项。这种方式不依赖手势的同时触发,可能绕过iOS17的手势冲突问题。
备注:内容来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

