具有动态路径大小的螺旋滚动器

Spiralling Scroller with Dynamic Path Sizing

我有一个服务器中的项目列表。这些项目有分数,分数对应于它们视图的大小(一个圆圈)。我想用最大的圆圈在中心描绘这些项目,每个连续的小圆圈环绕它,螺旋式越来越小。

一旦我实现了这一点,我想将它设置为一个卷轴。向上滚动会将每个连续较大的项目添加到螺旋的中心,并最终螺旋向下并远离,反之亦然。

这些对象的大小我已经执行过了。

这是我的方法:据我所知,本机 Swift 没有任何东西可以帮助我进行布局。 V/HStack 无济于事,ScrollView 也无济于事。基本上我的理解是,我应该创建一个路径,根据项目的大小计算其螺旋,这些项目应该使用 .offset 将它们自己定位在路径上。使用 DragGesture,我可以附加一个 @State 变量来确定每个项目在路径中的距离。

这是迄今为止最复杂的 UI 我已经尝试过,所以任何能让我走上正确道路的东西都将受到赞赏。

编辑 1: 这是理想的 UI:

我相信有多种方法可以解决这个问题。

使用 UIPanGestureRecognizer 向下拖动“顶部”视图 - 并在拖动过程中缩放它 - 非常简单。让“已经拖动”的视图围绕中心进行动画有点困难。

一种方法是使用 UIViewPropertyAnimator 并为圆弧周围的位置创建关键帧。

其他优势包括更少的计算(在 .began 状态下设置缩放和定位关键帧)以及能够“擦洗”动画。

我整理了一个小演示,最终看起来像这样:

您可以在此处试用源代码:https://github.com/DonMag/OrbitDrag