Перетащите uiview на части
-
25-10-2019 - |
Вопрос
У меня есть приложение с перетаскиваемым Uiview, расположенным внизу. Проявимый вид не является полностью за кадром, и у него есть «вкладка« Притяжение », которую пользователь может перетаскивать вверх или вниз. В настоящее время перетаскивание вверх и вниз работает, но я хотел бы дать ему то же поведение, что и уведомления Apple, выдвинув ящик.
Например, если я перетаскиваю вид на 50% вверх и удаляю пальцем с экрана, то я бы хотел, чтобы пропагандисый вид продолжал двигаться вверх самостоятельно. Аналогичным образом, если пользователь только вытащил представление, скажем, на 30% вверх, то представление должно опуститься в свою позицию по умолчанию.
В идеале, пока я могу сделать перетаскивание вверх/вниз, движение не очень "органично" ....
Прямо сейчас я выполняю перетаскивание вверх и вниз через Uipangesturerecognizer, на случай, если это имеет отношение к вопросу.
Возможно, это что -то вроде какого -то умной математики с положением Y драг -вида, а затем делает остальную часть движения с некоторыми каанимациями?
Это может быть немного сложно визуализировать, поэтому я добавил несколько экранов ниже.
Экран по умолчанию с видом внизу внизу
Представление перетаскивается через вкладку справа
Благодарю вас!
Решение
Когда ваш UIPanGestureRecognizer
Состояние становится UIGestureRecognizerStateEnded
, использовать velocityInView:
Сообщение, чтобы найти скорость жеста.
Если скорость близка к нулю, откройте или закрывайте представление на основе положения представления и предыдущего состояния представления. Например, если представление было закрыто, и его вытащили более 10%, откройте его. Если он был открыт и был вытянут более 10%, закройте его. В противном случае перенесите его обратно в свою позицию перед предварительным набором.
Если скорость не близка к нулю, используйте знак y -компонента, чтобы определить новое состояние представления. Если знак положительный, закройте представление. Если знак отрицательный, откройте представление.
Вам придется экспериментировать, чтобы точно выяснить, какое определение «близко к нулю» кажется лучше.
В любом случае, вы захотите оживить представление о его окончательной позиции после того, как жест заканчивается, используя короткую продолжительность (вероятно, от 0,1 и 0,25 секунды). Вы можете выбрать продолжительность, основываясь на скорости и расстоянии, которое необходимо пройти. Панель системных уведомлений делает это. (Попробуйте перетаскивать его на полпути медленно по сравнению с быстро. Он анимирует свою окончательную позицию на разных скоростях в зависимости от того, как быстро вы его перетаскивали, когда отпускаете.)
Вы захотите поэкспериментировать, чтобы найти лучшую кривую анимации (UIViewAnimationOptionCurveEaseOut
, и т. д.), и вы можете использовать другую кривую в зависимости от того, открываете ли вы или закрываете вид и скорость жеста.