UIPanGestureRecognizer делает что-то сразу при касании

Я новичок в ios, поэтому заранее прошу прощения, если я упустил что-то очевидное.

Я создаю головоломку, в которой я хотел бы, чтобы отдельные части головоломки увеличивались в размерах при касании и уменьшались при отпускании.

В настоящее время у меня есть:

-(IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{
  if(recognizer.state == UIGestureRecognizerStateBegan)
  else if(recognizer.state == UIGestureRecognizerStateEnded)
}

Кусок головоломки увеличивает размер, когда начинается панорама (которая также находится в состоянии состояния) и уменьшается в размере, когда кастрюля заканчивается (как и ожидалось). Я хотел бы, чтобы размер увеличивался после того, как пользователь коснулся части и до того, как движется головоломка. Это видно в словах с друзьями при выборе плитки.

Я пробовал

-(IBAction)handleTap:(UITapGestureRecognizer *)recognizer{
  if(recognizer.state == UIGestureRecognizerStateBegan)
  else if(recognizer.state == UIGestureRecognizerStateEnded)
}

Это увеличит часть головоломки только после того, как палец поднялся.

МОЙ ВОПРОС:

Есть ли способ увеличить размер кусочка головоломки, как только палец коснулся кусочка головоломки, а затем продолжит жест пан.

Спасибо заранее.

Ответ 1

Мне тоже нужно было это сделать, и предложение Джейка отлично работало для меня. Если это поможет любому, кто сталкивается с этим в будущем, вот моя реализация подкласса UIPanGestureRecognizer (заголовок остается неизменным):

#import "ImmediatePanGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@implementation ImmediatePanGestureRecognizer

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    self.state = UIGestureRecognizerStateBegan;
}

@end

Это все, что вам нужно - это сработает, как только вы поместите свой палец вниз в представление, обновите, как только вы поместите свой палец в одну точку в любом направлении, и обеспечите функциональность обычного UIPanGestureRecognizer ( например, translationInView и velocityInView) до того, как будет запущен обычный, без нарушения существующих функций.

Ответ 2

Я выполнил ответ Джорджа WS. С небольшим тестированием я понял, что дополнительные сенсорные события, которые происходят после первоначального касания, но до того, как начальные касания не будут правильно обработаны. Вот моя обновленная реализация. Это немного наивно, но предотвращает причудливое поведение, вызванное UIGestureRecognizerStateBegan, происходящее несколько раз.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.state >= UIGestureRecognizerStateBegan) {
        return;
    }

    [super touchesBegan:touches withEvent:event];
    self.state = UIGestureRecognizerStateBegan;
}

Ответ 3

Согласно документация UIPanGestureRecognizer входит только в UIGestureRecognizerStateBegan, когда "минимальное количество разрешенных пальцев (minimumNumberOfTouches) перемещено достаточно, чтобы считаться кастрюля". Если вы хотите, чтобы что-то случилось, как только вы коснетесь, вы можете попробовать подклассифицировать UIPanGestureRecognizer и верхом touchesBegan:withEvent:.

Ответ 4

Спасибо Джорджу WS и Деррику Хэтэуэйу

Swift 2.2

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
  if (self.state == UIGestureRecognizerState.Began) {
    return
  }
  super.touchesBegan(touches, withEvent: event)
  self.state = UIGestureRecognizerState.Began;
}

И вы должны добавить в свой заголовок Bridging-Header:

#import <UIKit/UIGestureRecognizerSubclass.h>

Ответ 5

Решение Swift 3/4

import UIKit.UIGestureRecognizerSubclass

class InstantPanGestureRecognizer: UIPanGestureRecognizer {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if (self.state == UIGestureRecognizerState.began) { return }
        super.touchesBegan(touches, with: event)
        self.state = UIGestureRecognizerState.began
    }

}

Ответ 6

Я пытаюсь сделать аналогичную вещь, и резолюция, над которой я работаю, - это использовать touch touchBegan: withEvent: выполнить действия, которые я хочу выполнить, когда пользователь коснется экрана. Затем обработчик жестов берет верх, когда прикосновение становится жестом.