Вы правы, что код, на который вы ссылались, может быть использован для вычисления коэффициента демпфирования (я польщен, потому что я тот, кто его написал;).Похоже, у вас есть ошибка в вашем производном коде Swift.Я думаю, что это должно быть (обратите внимание на разницу в скобках):
let damping: CGFloat = 20.5 / (2 * (1 * 280).squareRoot())
Значение скорости необходимо только в том случае, если вы хотите дать объекту некоторую начальную скорость при запуске анимации.Вариант использования для этого - если объект уже движется при запуске анимации (например, при запуске анимации после взаимодействия с перетаскиванием).
Таким образом, если объект начинает анимацию из неподвижного состояния, вы можетепросто используйте 0 в качестве начальной скорости.
Меня смущает ваша команда дизайнеров, дающая вам напряжение, трение и длительность .Поскольку пружины симулируют физику, натяжение и трение будут симулировать пружину, которая прекратит анимацию через определенное время.Пружина с натяжением 280
и трением 20.5
приводит к продолжительности, близкой к 0.65
, а не 0.3
.(см. функцию computeDuration
во Фреймере, как рассчитать длительность по напряжению и трению).Вот версия coffeescript:
# Tries to compute the duration of a spring,
# but can't for certain velocities and if dampingRatio >= 1
# In those cases it will return null
exports.computeDuration = (tension, friction, velocity = 0, mass = 1) ->
dampingRatio = computeDampingRatio(tension, friction)
undampedFrequency = Math.sqrt(tension / mass)
# This is basically duration extracted out of the envelope functions
if dampingRatio < 1
a = Math.sqrt(1 - Math.pow(dampingRatio, 2))
b = velocity / (a * undampedFrequency)
c = dampingRatio / a
d = - ((b - c) / epsilon)
if d <= 0
return null
duration = Math.log(d) / (dampingRatio * undampedFrequency)
else
return null
return duration
Причина, по которой вы можете указать продолжительность для пружин, используемых iOS, заключается в том, что она рассчитывает натяжение и трение пружины на основе коэффициента демпфирования и продолжительности.Под капотом он все равно будет использовать натяжение и трение для симуляции пружины.Чтобы получить представление о том, как этот код работает в iOS, посмотрите на computeDerivedCurveOptions
во Framer, который является прямым портом кода, используемого iOS (созданный путем разборки и анализа двоичных файлов iOS).