Как аккуратно перетащить панель с экрана, как приложение JetBlue для iPhone - PullRequest
4 голосов
/ 21 марта 2012

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

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

У меня есть похожий элемент интерфейса в приложении, которое я написал. Мой элемент интерфейса - это UIViewController для всей панели инструментов. Я помещаю UIB-кнопку поверх рисунка захвата, меняю тип кнопки на пользовательский, чтобы он визуально исчезал. Я подключаю Touch Drag Inside и Touch Drag Outside к IBAction, который регулирует положение панели в соответствии с тем, куда перемещается перетаскивание. Я подключаю Touch Up Inside и Touch Up Outside к IBAction, который завершает позиционирование вида. Если событие касания происходит слишком близко ко дну, я просто закрываю панель. Если это происходит где-то выше этого порога, я открываю панель. Я использую методы анимации UIView, чтобы сгладить эти переходы. Элемент избыточного расширения, видимый в приложении JetBlue, может быть выполнен в обработчике перетаскивания. Когда панель становится все ближе и ближе к пределу, открывайте вид все меньше и меньше с каждым движением касания выше. Затем в финализации просто анимируйте панель обратно в желаемое конечное положение.

Приложение JetBlue отличается от моего приложения тем, что у меня небольшая область захвата, но приложение JetBlue позволяет смахивать всю панель, чтобы отрегулировать положение. Чтобы соответствовать этой функциональности, я бы настроил свою реализацию, чтобы полностью покрыть панель кнопками. Каждый ответил бы на мои события перетаскивания с добавлением, что перетаскивание установит флаг Тогда мой обработчик события касания проверит, установлен ли флаг. Если это так, завершите перетаскивание панели. В противном случае выполните соответствующее действие, связанное с каждой кнопкой.

3 голосов
/ 22 марта 2012

Если вы уже можете реализовать основы с помощью жестов, то вы почти у цели!

Если честно, хотя я сделал именно это в своем приложении, я использую старомодные штрихи Beg, touchesMoved,и т. д.

С точки зрения жестов вам придется использовать UIPanGestureRecognizer, чтобы иметь полный контроль над перетаскиванием.UISwipeGestureRecognizer распознает только считывания.

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

CGRect newPanelFrame = panel.frame;
if (newPanelFrame.origin.y + dragOffset > 275) {
   newPanelFrame.origin.y += dragOffset / 2.0;
}
panel.frame = newPanelFrame;

In touchesEnded:withEvent: или if (gestureRecognizer.state == UIGestureRecognizerStateEnded)

CGRect newPanelFrame = panel.frame;
if (newPanelFrame.origin.y > 275) {
   newPanelFrame.origin.y = 275;
}
panel.frame = newPanelFrame;

Причина, по которой я никогда не беспокоился о UIPanGestureRecognizer, заключается в том, что я никогда не мог понять, как получить некумулятивный перевод (translationForView: является накопительным), который необходим, еслиВы хотите существенно замедлить перетаскивание после порога.

0 голосов
/ 29 июля 2013

Я просто проводил некоторые исследования по достижению аналогичного эффекта, наткнулся на этот пост и в результате решил попробовать JetBlue.

Поработав немного со скользящей панелью, я подумал, что ребята из JetBlue пошли на это немного по-другому.

Движения ползунка в приложении JetBlue, кажется, обрабатывают намного лучше, чем то, что вы могли бы сделать с коллекцией UIGestureRecognizer; он способен анимировать на разных скоростях, в зависимости от того, как быстро пользователь смахивает его, и резиновая полоса также компенсирует это должным образом.

Итак, на этом замечании я на самом деле думаю, что они не используют UIGestureRecognizer, но эта панель на самом деле является просто стандартным UIScrollView, выровненным по нижней части окна приложения и с небольшой дополнительной логикой (возможно, примененной через делегат ) это просто гарантирует, что представление прокрутки не сможет остановить анимацию между состояниями «открыто» и «закрыто».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...