Возможно ли управлять невизуальным свойством из анимированного элемента управления? - PullRequest
0 голосов
/ 14 апреля 2019

Допустим, я строю ползунок управления и анимирую его с помощью UIViewPropertyAnimator, чтобы он имел импульс, когда я освобождаюсь от сопротивления со скоростью.

Можно ли управлять невизуальным свойством из анимации этого ползунка? Я искал какой-то обратный вызов для каждого кадра или что-то, что позволило бы мне использовать анимацию и управлять параметром из нее.

В качестве альтернативы возможно ли создать анимируемый объект сам и управлять им с помощью той же анимации?

В качестве примера подумайте о ползунке, который управляет яркостью лампочки, которая управляется через сетевой протокол. Когда я отпущу ползунок, и он начнет анимироваться, мне нужно будет как-то определить положение ползунка, рассчитать соответствующий уровень яркости и превратить его в команду яркости для лампы.

Я оглянулся, но не нашел стратегии для этого. Любая подсказка будет высоко оценена.

Спасибо за вашу поддержку !! -mj

1 Ответ

0 голосов
/ 14 апреля 2019

Я не уверен, что вы могли бы анимировать подобное изменение внутри блока анимации, но вы определенно могли бы сделать это с помощью UIGestureRecognizer. В этом классе есть методы делегата, которые могут довольно часто информировать вас о положении жеста перетаскивания, и вы можете использовать эти обратные вызовы для вычисления «процента» перемещения жеста по ползунку, который вы пытаетесь построить, и использовать это значение для установки значения. яркость лампочки.

Чтобы смоделировать нужный вам импульс, вам нужно будет использовать функцию velocity(in: ) из UIPanGestureRecognizer, а затем использовать это значение, чтобы смоделировать, как вы хотите, чтобы скорость уменьшилась.

В зависимости от того, насколько точным вы хотите, чтобы было замедление вашего ползунка, вы можете использовать некоторые физические уравнения, такие как TimeToStop = InitialVelocity/DecelerationRate, где скорость замедления является константой, которую вы сохраняете как константу и с которой будете играть, пока не получите значение, которое тебе нравится. С этими значениями у вас есть много вариантов того, как генерировать обратные вызовы, которые вы ищете. Я бы предложил выбрать постоянную на сколько секунд между обратными вызовами вы хотите, чтобы вы могли адаптировать их к цели (то есть вы не хотите делать 10 сетевых вызовов в секунду). Затем используйте эту константу, чтобы выяснить, сколько раз вы хотите запустить обратный вызов, а затем используйте асинхронную задержку или таймер для запуска обратного вызова со значением ползунка, которое будет SlideOffset = OffsetWhenGestureEnded + VelocityWhenGestureEnded*TimeToStop + 0.5*DecelerationRate*TimeToStop^2

...