У меня есть вид, который должен UIPanGestureRecognizer
перетащить вид вертикально. Поэтому в обратном вызове распознавателя я только обновляю координату y, чтобы переместить его. В суперпредставлении этого вида есть объект, UIPanGestureRecognizer
который будет перетаскивать вид по горизонтали, просто обновляя x-координату.
Проблема в том, что первое UIPanGestureRecognizer
- это событие, которое перемещает представление по вертикали, поэтому я не могу использовать жест суперпредставления.
я пытался
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
и оба будут работать, но я этого не хочу. Я хочу, чтобы горизонтальность определялась только в том случае, если движение явно горизонтальное. Так что было бы здорово, если бы UIPanGestureRecognizer
имел свойство направления.
Как я могу добиться этого поведения? Я нахожу документы очень запутанными, поэтому, возможно, кто-то сможет объяснить это лучше здесь.
источник
Ответы:
Просто сделайте это для распознавателя жестов вертикальной панорамирования, он работает для меня:
И для Свифта:
источник
velocityInView
вместоtranslationInView
.Я создал решение с использованием подклассов, как в ответе @LocoMike, но использовал более эффективный механизм обнаружения с помощью начальной скорости, предоставленной @Hejazi. Я также использую Swift, но при желании это легко перевести на Obj-C.
Преимущества перед другими решениями:
Вот код:
Пример использования:
источник
UIPanGestureRecognizer
.let horizontalPanRecognizer = PanDirectionGestureRecognizer(direction: .horizontal, target: self, action: #selector(handleHorizontalPanGesture(recognizer:))) self.view?.addGestureRecognizer(horizontalPanRecognizer); let verticalPanRecognizer = PanDirectionGestureRecognizer(direction: .vertical, target: self, action: #selector(handleVerticalPanGesture(recognizer:))) self.view?.addGestureRecognizer(verticalPanRecognizer);
Я понял это, создав подкласс UIPanGestureRecognizer
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Это вызовет только жест, если пользователь начнет перетаскивать в выбранном поведении. Установите для свойства direction правильное значение, и все готово.
источник
initWithTarget:action:
метод и вызвал сброс, и все было хорошо.DirectionPanGestureRecognizer
будут игнорироваться быстрые перетаскивания, если вы не установилиkDirectionPanThreshold = 20
или около того, и в этом случае он может выдавать ложные тревоги. Я предлагаю ставитьabs(_moveX) > abs(_moveY)
вместоabs(_moveX) > kDirectionPanThreshold
и менять горизонтальный регистр соответственно._drag = YES
я добавилself.state = UIGestureRecognizerStateChanged;
Я попытался ограничить допустимую область по горизонтали с помощью UIPanGestureRecognizer.
Затем, только проведя в пределах порога по горизонтали и градуса, можно запустить этот жест панорамирования.
источник
Swift 3.0 ответ: просто ручками делает вертикальный жест
источник
Следующее решение решило мою проблему:
Это на самом деле просто проверить, происходит ли панорамирование на главном или табличном представлении.
источник
Swift 3 версия ответа Ли для ленивых
источник
Я взял Ли Goodrich «S ответ и расширил его , как мне нужно конкретно одно направление панорамирования. Используйте это так:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))
Я также добавил некоторые комментарии, чтобы прояснить, какие решения на самом деле принимаются.
источник
override func touchesMoved
-Method does not override any method from its superclass
.Вы можете найти направление, которое тянется
UIView
насквозьUIPanGestureRecognizer
. Пожалуйста, следуйте за кодом.источник
Swift 4.2
Решение только для поддержки жеста панорамирования по вертикали, также как и по горизонтали.
Решение 1 :
Решение 2:
Тогда жест смахивания проглотит жест панорамирования. Конечно, вам не нужно ничего делать
swipeAction
.источник
Вот как я решил:
Сначала я включил одновременное распознавание PanGesture.
Затем я изолирую жесты горизонтальной и вертикальной панорамы (аккумулятор является свойством NSMutableArray):
Я привел пример здесь:
добавить кастомную панораму в scrollview
источник
источник
Вы можете использовать простой
panGestureRecognizer
. Не нужно использоватьpandirectionregognizer
или вещи. Просто используйте значение y изtranslationInview
Below code, перемещайте вид перетаскивания только вверх и внизисточник
Я создал метод действия PanGestureRecognizer @selector для объекта, который нуждался только в горизонтальной прокрутке.
источник
Быстрый путь
источник
Для всех пользователей Swift это сделает эту работу :)
источник
Я взял отличный ответ Ли Гудрича и портировал на Swift 3
источник
Я хотел бы поделиться своим подходом, потому что все другие подходы основаны на одном
UIGestureRecognizerDelegate
или подклассахUIPanGestureRecognizer
.Мой подход основан на времени выполнения и Swizzling. Я не уверен на 100% в этом подходе, но вы можете проверить и улучшить его самостоятельно.
Установите направление любого
UIPanGestureRecognizer
с помощью только одной строки кода:используйте
pod 'UIPanGestureRecognizerDirection'
или код:источник
Я попробовал это: который работал для меня согласно описанному вопросу
источник
SWIFT 4.2
Я пошел дальше и сделал направление Пан Жест:
(Используется: https://github.com/fastred/SloppySwiper и https://stackoverflow.com/a/30607392/5790492 )
источник
Вот пользовательский жест панорамирования в Swift 5
Вы можете ограничить его направление и максимальный угол в направлении, вы также можете ограничить его минимальную скорость в направлении.
позвоните так:
или
источник
PanGestureRecognizer
Интерфейс содержит следующие определения:Я не проверял это, но, возможно, он доступен через подкласс.
источник