Я пытаюсь реализовать пейджинговое взаимодействие для одного из моих представлений. Я думал, что просто использую UISwipeGestureRecognizers
. Но путем проб и ошибок, а также изучения документации оказалось, что
Смахивание — это дискретный жест, поэтому связанное с ним сообщение о действии отправляется только один раз для каждого жеста.
Таким образом, хотя я мог вызвать страницу, я не смог бы подключить анимацию, которая возникла во время перетаскивания.
Является ли моя единственная альтернатива использованию UIPanGestureRecognizer
и повторной реализации базовой фильтрации/вычислений салфетки?
Обновление/сокращение
Оглядываясь назад, я действительно должен был спросить, как реализовать жест «щелчок». Если вы не собираетесь создавать свой собственный подкласс (можете немного его откусить), вы используете UIPanGestureRecognizer, как указывает ответ @Lyndsey. Что я искал после этого (в комментариях), так это то, как сделать часть щелчка, где импульс щелчка влияет на решение о том, продолжать ли движение щелчка или возвращаться к исходной презентации.
UIScrollView имеет такое поведение, и заманчиво изучить его реализацию для получения подробной информации о том, как можно замедлить импульс таким образом, чтобы это было согласованным, но, увы, decelerationRate
, предоставленное для UIScrollView
, является значением «за итерацию» (согласно некоторым). Я ломал голову над тем, как правильно применить значение по умолчанию 0,998 к конечной скорости панорамирования.
В конце концов, я использовал код, взятый с сайтов о вычислении «щелчка», и сделал что-то вроде этого в своем обработчике жестов:
...
else if (pan.state == UIGestureRecognizerStateEnded) {
CGFloat v = [pan velocityInView: self.view].x;
CGFloat a = -4000.0; // 4 pixels/millisecond, recommended on gavedev
CGFloat decelDisplacement = -(v * v) / (2 * a); // physics 101
// how far have we come plus how far will momentum carry us?
CGFloat totalDisplacement = ABS(translation) + decelDisplacement;
// if that is (or will be) half way across our view, finish the transition
if (totalDisplacement >= self.view.bounds.size.width / 2) {
// how much time would we need to carry remainder across view with current velocity and existing displacement? (capped)
CGFloat travelTime = MIN(0.4, (self.view.bounds.size.width - ABS(translation)) * 2 / ABS(v));
[UIView animateWithDuration: travelTime delay: 0.0 options: UIViewAnimationOptionCurveEaseOut animations:^{
// target/end animation positions
} completion:^(BOOL finished) {
if (finished) {
// any final state change
}
}];
}
else { // put everything back the way it was
...
}
}
UIPanGestureRecognizer
, если вы хотите, чтобы определенная скорость, угол, изменения и т. д. смахивания запускали вашу анимацию.UISwipeGestureRecognizer
— это действительно один дискретный жест... похожий наUITapGestureRecognizer
. - person Lyndsey Scott   schedule 22.11.2014