SwiftUI线性滑动指南针实现求助:解决循环滚动衔接问题

问题说明
我正尝试在SwiftUI中实现上图所示的线性滑动指南针。最初打算使用ScrollView和ScrollViewReader,但很快遇到从360度切换到1度(或反向)的循环滚动衔接问题,后续考虑LazyHStack也存在类似问题,需要实现支持双向持续旋转时的无缝循环滚动效果。
可行实现思路
伪循环布局重置法
不要只渲染一组360个刻度,而是在可视区域的左右各额外渲染一组完整刻度(共3组)。通过ScrollViewReader监听滚动偏移,当滚动到接近某一侧边界时(比如即将滑到右侧组的末尾),立刻调用scrollTo将位置重置到中间组的对应刻度位置,同时由于三组刻度完全一致,用户视觉上感知不到跳转,实现无缝循环。需要注意计算好滚动触发重置的阈值,确保衔接自然。手动控制偏移的无限滚动
放弃原生ScrollView,用GeometryReader获取容器尺寸,将刻度放在HStack中,通过@State变量控制offset属性模拟滚动。结合DragGesture捕获用户滑动手势,更新offset值;当offset超出单组刻度的宽度时,对offset取单组宽度的模,同时调整刻度的显示内容偏移,让布局始终保持连续。这种方式完全自定义滚动逻辑,不受原生组件的边界限制。角度映射渲染法
不依赖物理滚动,而是根据当前目标角度,计算每个刻度在可视区域内的位置和显示文本。只渲染可视范围内的刻度,当角度从360°切换到1°时,直接更新角度映射逻辑,让新的刻度平滑进入视图,旧刻度平滑退出,视觉上实现循环效果。这种方案无需处理滚动边界,更适配角度循环的场景,性能也更优(只渲染可见元素)。
内容的提问来源于stack exchange,提问作者Mountainbrussell

