You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现与文本长度无关的自动滚动恒定动画速度?

实现与文本长度无关的恒定自动滚动速度

问题出在你用了固定的.speed(0.1)参数——动画总时长固定的情况下,长文本滚动距离更长,实际移动速度自然更快;短文本则相反。要实现恒定速度,核心是根据滚动总距离动态计算动画时长,让每秒滚动的像素点数保持一致。

具体实现步骤

  • 计算滚动总距离:先算出内容总尺寸(比如文本高度)和滚动视图可视尺寸的差值,这就是需要滚动的总距离。比如垂直滚动时:总滚动距离 = 内容总高度 - 滚动视图可视高度。
  • 设定固定速度:定义一个恒定的速度值,比如let scrollSpeed: CGFloat = 50(代表每秒滚动50个像素点)。
  • 动态计算动画时长:动画时长 = 总滚动距离 / 滚动速度。如果总距离≤0(内容不需要滚动),直接返回nil不启动动画。
  • 重构动画逻辑:把固定speed的动画换成基于计算时长的线性动画,再保留延迟、重复反转的配置。

示例代码

// 先实现滚动总距离的计算(以垂直滚动为例)
private var totalScrollDistance: CGFloat {
    // 这里需要根据你的自定义滚动视图,正确获取内容总高度和可视高度
    // 可通过GeometryReader或自定义视图的属性来获取这些值
    contentTotalHeight - scrollViewVisibleHeight
}

// 设定恒定滚动速度(每秒滚动的像素点数)
private let scrollSpeed: CGFloat = 50

private var autoScrollAnimation: Animation? {
    guard totalScrollDistance > 0 else { return nil }
    let animationDuration = totalScrollDistance / scrollSpeed
    return Animation.linear(duration: animationDuration)
        .delay(2)
        .repeatForever(autoreverses: true)
}

应用动画到滚动视图

将动画绑定到滚动视图的偏移量上,确保偏移目标值等于总滚动距离:

ScrollView {
    // 你的文本内容视图
}
.offset(y: isAutoScrolling ? -totalScrollDistance : 0)
.animation(autoScrollAnimation, value: isAutoScrolling)

注意事项

  • 要保证totalScrollDistance的计算准确,可借助GeometryReader获取滚动视图和内容的实际尺寸。
  • 如果是水平滚动,只需把高度相关的计算替换成宽度即可。
  • 当内容尺寸动态变化时(比如文本更新),要重新计算动画时长,维持速度恒定。

内容的提问来源于stack exchange,提问作者Amin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:10:09