IOS перетащить, щелкнуть или бросить UIView
Мне было интересно, как бы я выбрал UIView, например, http://www.cardflick.co/ или https://squareup.com/cardcase демонстрационные видео.
Я знаю, как перетаскивать предметы, но как вы даете им гравитацию / инерцию. Это обрабатывается IOS?
3 ответа
Эффекты, которые вы описываете как имитирующие король гравитации / инерции, могут быть достигнуты с помощью функций синхронизации замедления (начало быстрое, медленное завершение) и замедления (начало медленное, быстрое завершение).
Поддержка замедления и ослабления доступна в iOS, поэтому я не думаю, что вам нужна какая-либо внешняя библиотека или тяжелая работа (хотя, как вы можете себе представить, ваш эффект потребует много тонкой настройки).
Это оживит перевод объекта в заданную позицию с эффектом замедления:
[UIView animateWithDuration:2.0 delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^ {
self.image.center = finalPosition;
}
completion:NULL];
}
Если вы справитесь со своим жестом через UIPanGestureRecognizer
распознаватель жестов предоставит вам две важные данные для расчета конечной позиции: velocity
а также translation
, которые представляют соответственно, насколько быстро и сколько объект был перемещен.
Вы можете установить в вашем представлении распознаватель жестов панорамирования (я думаю, это будет объект, который вы хотели бы анимировать) следующим образом:
UIPanGestureRecognizer* panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
[yourView addGestureRecognizer:panGestureRecognizer];
[panGestureRecognizer release];
А затем обработайте анимацию в вашем обработчике:
- (void)handlePanFrom:(UIPanGestureRecognizer*)recognizer {
CGPoint translation = [recognizer translationInView:recognizer.view];
CGPoint velocity = [recognizer velocityInView:recognizer.view];
if (recognizer.state == UIGestureRecognizerStateBegan) {
} else if (recognizer.state == UIGestureRecognizerStateChanged) {
<track the movement>
} else if (recognizer.state == UIGestureRecognizerStateEnded) {
<animate to final position>
}
}
iOS не имеет встроенного API для гравитации / инерции. Ваши лучшие варианты:
Имитируйте эффект с помощью анимации: если вы двигаете объект по направлению к цели (он не должен отражаться от предметов), вы, вероятно, можете получить довольно хороший результат, просто отправив его на цель и настроив кривую синхронизации анимации.
Используйте библиотеку физики. Сибирский бурундук - это высококачественный продукт, и iOS поддерживает его в большом количестве. Вы устанавливаете объекты, присваиваете им веса, описываете их формы, а затем код библиотеки выдаст вам обновленные (x,y) координаты, чтобы вы могли обновлять свои объекты на экране.
В iOS нет ничего такого, что могло бы сделать это для вас, но вы можете легко реализовать это самостоятельно. Я бы начал с создания распознавателя жестов, который распознает жест "щелчка", который вы хотите использовать, возможно, который ищет постоянное направление и увеличение скорости. Когда вы узнаете такой жест, вам просто нужно соответствующим образом анимировать положение затронутого вида.