Объединение UILONGPRESSGESTUREURECOGNIZER с UIPANGESTURELERECON
Вопрос
Я хотел бы объединить UILongpress Gesturecognizer с UipangestureVelectorizer.
UipangeStureVegrize должен начать с длинной прессы. Есть ли простой способ сделать это? Или мне действительно нужно написать свой собственный распознатель жеста?
Я не хочу на домашнем экране. Вы нажимаете на значок и через некоторое время значки начнут колебаться. После этого не освобождая палец с экрана, я могу начать перетаскивать значок под моим пальцем.
Решение 3
Я нашел решение: этот метод UigestureVognizerDelegate имеет именно то, что я искал:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
Другие советы
На самом деле, вам не нужно комбинировать опознаватели жест - вы можете сделать это исключительно с UILongpress Gesturecognizer ... вы входите в Stustlbegan после того, как прикосновение (ES) остались в «AllowableMovement» для «Министерства минимальной передачи». Вы остаетесь в своем непрерывном DangePress в центре, если вы не поднимаете никаких пальцев - так что вы можете начать двигать пальцами и отслеживать движение через StateChanged.
Длинные прессе жесты непрерывно. Жест начинается (UigestureCognizerstatebegan), когда был нажат количество допустимых пальцев (nalloftechesRequired) в течение указанного периода (министраю передатчика), а касания не выходит за пределы допустимого диапазона движения (AllowableMovement). Жест распознаватель переходов в состояние изменения, когда палец движется, и он заканчивается (UigestureCognizerstate), когда любой из пальцев поднят.
У меня было немного трудно для этой проблемы. Принятый ответ был недостаточно. Независимо от того, что я положил в этот метод. Решение, которое я нашел, было следующим:
- Убедитесь, что делегаты распознавателей жестов назначены один и тот же класс (в моем случае) и убедитесь, что класс делегата является
UIGestureRecognizerDelegate
. Добавьте следующий метод делегата в ваш класс (согласно ответу выше):
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }
Добавьте следующий метод делегата в ваш класс:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) { return NO; } return YES; }
Затем добавьте свой свойство или IVAR, который будет отслеживать, следует ли начать сковороду (см. Метод выше). В моем случае
BOOL shouldAllowPan
.Установите бул
NO
в твоейinit
илиviewDidLoad
. Отказ Внутри вашего обработчика TongPress установите Bool наYES
. Отказ Я делаю это так:- (void) longPressHandler: (UILongPressGestureRecognizer *) gesture { if(UIGestureRecognizerStateBegan == gesture.state) { shouldAllowPan = NO; } if(UIGestureRecognizerStateChanged == gesture.state) { shouldAllowPan = YES; } }
Внутри Panhandler я делаю проверку на Bool:
- (void)panHandler:(UIPanGestureRecognizer *)sender{ if(shouldAllowPan) { // do your stuff }
И, наконец, сбросьте Bool внутри Panhandler:
else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) { shouldAllowPan = NO; }
А потом пойти схватить пиво, чтобы поздравить себя. ;)
Энди Б подход в Свифт,
Добавить UigestureCognizerDelegate. Делегат к классу
class ViewController: UIViewController, UIGestureRecognizerDelegate
Добавить переменную пользователя
var shouldAllowPan: Bool = false
Добавьте жесты и нужно добавить делегат жест Pan для VC. Это необходимо для увольнения пожелания потенциальному вопросу и гестереюремизировать функции GesturecognizerShoughoughn
// long press let longPressRec = UILongPressGestureRecognizer(target: self, action: "longPress:") yourView.addGestureRecognizer(longPressRec) // drag let panRec = UIPanGestureRecognizer(target: self, action: "draggedView:") panRec.delegate = self yourView.addGestureRecognizer(panRec)
Разрешить одновременные жесты
func gestureRecognizer(UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool { // println("shouldRecognizeSimultaneouslyWithGestureRecognizer"); return true } func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { // We only allow the (drag) gesture to continue if it is within a long press if((gestureRecognizer is UIPanGestureRecognizer) && (shouldAllowPan == false)) { return false; } return true; }
Внутри длинный печать
func longPress(sender: UILongPressGestureRecognizer) { if(sender.state == .Began) { // handle the long press } else if(sender.state == .Changed){ shouldAllowPan = true } else if (sender.state == .Ended) { shouldAllowPan = false } }
Прочитайте раздел «Примечания подклассов» Ссылка класса UGESTURECOGURIZORECOGNIZE Apple по адресу: