Вопрос

Я хотел бы объединить UILongpress Gesturecognizer с UipangestureVelectorizer.

UipangeStureVegrize должен начать с длинной прессы. Есть ли простой способ сделать это? Или мне действительно нужно написать свой собственный распознатель жеста?

Я не хочу на домашнем экране. Вы нажимаете на значок и через некоторое время значки начнут колебаться. После этого не освобождая палец с экрана, я могу начать перетаскивать значок под моим пальцем.

Это было полезно?

Решение 3

Я нашел решение: этот метод UigestureVognizerDelegate имеет именно то, что я искал:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Другие советы

На самом деле, вам не нужно комбинировать опознаватели жест - вы можете сделать это исключительно с UILongpress Gesturecognizer ... вы входите в Stustlbegan после того, как прикосновение (ES) остались в «AllowableMovement» для «Министерства минимальной передачи». Вы остаетесь в своем непрерывном DangePress в центре, если вы не поднимаете никаких пальцев - так что вы можете начать двигать пальцами и отслеживать движение через StateChanged.

Длинные прессе жесты непрерывно. Жест начинается (UigestureCognizerstatebegan), когда был нажат количество допустимых пальцев (nalloftechesRequired) в течение указанного периода (министраю передатчика), а касания не выходит за пределы допустимого диапазона движения (AllowableMovement). Жест распознаватель переходов в состояние изменения, когда палец движется, и он заканчивается (UigestureCognizerstate), когда любой из пальцев поднят.

У меня было немного трудно для этой проблемы. Принятый ответ был недостаточно. Независимо от того, что я положил в этот метод. Решение, которое я нашел, было следующим:

  1. Убедитесь, что делегаты распознавателей жестов назначены один и тот же класс (в моем случае) и убедитесь, что класс делегата является UIGestureRecognizerDelegate.
  2. Добавьте следующий метод делегата в ваш класс (согласно ответу выше):

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
         return YES;
    }
    
  3. Добавьте следующий метод делегата в ваш класс:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
         if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
              return NO;
         }
         return YES;
    }
    
  4. Затем добавьте свой свойство или IVAR, который будет отслеживать, следует ли начать сковороду (см. Метод выше). В моем случае BOOL shouldAllowPan.

  5. Установите бул NO в твоей init или viewDidLoad. Отказ Внутри вашего обработчика TongPress установите Bool на YES. Отказ Я делаю это так:

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
    
         if(UIGestureRecognizerStateBegan == gesture.state) {
            shouldAllowPan = NO;
         }
    
         if(UIGestureRecognizerStateChanged == gesture.state) {
            shouldAllowPan = YES;
         }
    }
    
  6. Внутри Panhandler я делаю проверку на Bool:

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
  7. И, наконец, сбросьте Bool внутри Panhandler:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
  8. А потом пойти схватить пиво, чтобы поздравить себя. ;)

Энди Б подход в Свифт,

  1. Добавить UigestureCognizerDelegate. Делегат к классу

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
  2. Добавить переменную пользователя

    var shouldAllowPan: Bool = false
    
  3. Добавьте жесты и нужно добавить делегат жест 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)
    
  4. Разрешить одновременные жесты

    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;
    }
    
  5. Внутри длинный печать

    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 по адресу:

https://developer.apple.com/library/prerelease/tvos/documentation/uikit/reference/uigestureVognizer_class/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top