iPhone добавляет физику инерции / импульса, чтобы оживить "колесо фортуны", как вращающийся элемент управления

Я пытаюсь создать новый вид поворотного управления с внешним видом настоящего массивного колеса, опирающегося на штифт, способного вращаться вокруг своей центральной точки с определенной степенью демпфирования, что в конечном итоге приведет к остановке колеса, Подумайте "колесо фортуны".

Пример поворотного управления

Ротационный контрольный образец проекта

При работе с собственными UITableView и / или UIScrollView их можно "перевернуть" в одном направлении и продолжать прокручивать в этом направлении некоторое время. Я знаю, что подобный эффект может быть достигнут с кривой анимации.

Что меня интересует, так это как рассчитать, как далеко элемент интерфейса должен прокручиваться / вращаться в зависимости от расстояния / скорости, пройденного пальцем. Различные типы "щелчков" будут вызывать различное поведение, передавая "импульс" колесу. Кто-нибудь может предложить примеры таких расчетов?

Я особенно заинтересован в применении той же концепции инерции к пользовательскому элементу управления вращением, как описано здесь: Управление вращением при переполнении стека. Текущие примеры и даже приложение convertbot, упомянутое в примерах, не используют инерцию. Колесо просто следует за пальцем и защелкивается в заданных положениях. Я хочу, чтобы подобное колесо ощущалось так, как будто оно имеет реальную массу, чтобы его можно было щелкнуть и вращаться предсказуемым образом до полной остановки. (Вспомним, как показывает "колесо фортуны").

Как я могу добиться такого типа поведения "колеса фортуны", основанного на инерции, для вращающегося элемента управления, который позволил бы создать ощущение, что элемент управления имеет реальную массу?

Спасибо!

2 ответа

Решение

Я обнаружил, что с помощью iCarousel можно создать колесо, подобное управлению с инерцией / импульсом!

Реализация полностью реалистичного массового эффекта не так тривиальна, и, возможно, требует слишком много работы (особенно для такой простой задачи), поэтому я игнорировал бы законы физики (кроме строго необходимых) и сделал бы все проще.

Импульс r x F где r это радиус и F приложенная сила Так как это зависит от радиуса, чем больше вы удаляетесь от центра вашего колеса, тем больше будет импульс. Давайте проигнорируем это и предположим, что сила является касательной и применяется всегда при r = wheelWidth / 2.

Кроме того, вместо вычислительной силы вы можете просто сделать это в зависимости от скорости жеста (проще, чем вычислительная сила, так как она требует массы и ускорения). Таким образом, мы можем представить, что более быстрое прикосновение будет соответствовать большему импульсу.

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

Вы можете получить скорость жеста, вы можете просто вычислить начальную и конечную позицию касания и поделить их разницу на прошедшее время.

Чтобы получить эффект замедления, вы должны предположить, что, когда колесо движется, всегда существует противоположный крутящий момент. Вы можете определить его во время компиляции или сделать его зависимым от ширины вашего колеса (так, чтобы большие колеса замедлялись быстрее).

Теперь у вас есть почти все, что вам нужно... удачи:)

Другие вопросы по тегам