отключить распознавание пинча, когда 1 палец поднят - PullRequest
1 голос
/ 22 января 2012

У меня есть 2D-карта, которую пользователь может масштабировать и панорамировать с помощью распознавателей жестов. В то время как это работает, я хочу, чтобы пользователь начал панорамирование сразу после увеличения, когда он поднял 1 палец. К сожалению, в документах написано:

Жест заканчивается (UIGestureRecognizerStateEnded), когда оба пальца поднять со взгляда.

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

Ответы [ 2 ]

5 голосов
/ 22 января 2012

Это возможно и просто! Это означает, что вы должны быть делегатом вашего распознавателя жестов. Кажется, что-то, что никто не знает, существует. В моем подклассе контроллера представления я объявил и соответствие протоколу <UIGestureRecognizerDelegate> и два ivars:

UIPinchGestureRecognizer *myPinchGR;
UIPanGestureRecognizer *myPanGR;

Эти ивары создаются с учетом загрузки. Обратите внимание на настройку self в качестве делегата.

-(void)viewDidLoad{
    [super viewDidLoad];
    myPanGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panTarget:)];
    myPanGR.delegate = self;
    [self.view addGestureRecognizer:myPanGR];

    myPinchGR = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchTarget:)];
    myPinchGR.delegate = self;
    [self.view addGestureRecognizer:myPinchGR];
}

Один из вызовов делегата, сделанный UIGestureRecognizer, является shouldRecognizeSimultaneouslyWithGestureRecognizer:, если бы у меня было более двух распознавателей жестов, тогда эта функция должна была бы содержать некоторую логику. Но так как есть только два, я могу просто вернуть YES.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

Теперь вам нужно включить немного (очень мало) дополнительной логики в свои методы действий для проверки на соответствующие условия.

-(void)panTarget:(UIPanGestureRecognizer *)panGR{
    if (panGR.numberOfTouches > 1) return;
    NSLog(@"panny");
}
-(void)pinchTarget:(UIPinchGestureRecognizer *)pinchGR{
    if (pinchGR.numberOfTouches < 2) return;
    NSLog(@"pinchy");
}

Запустите этот код, посмотрите журналы. вы будете видеть, когда вы будете двигать одним пальцем, вы увидите «панни», когда вы положите второй палец вниз, вы увидите «щепотку», и вперед и назад.

0 голосов
/ 07 июня 2018

Используйте этот код внутри метода обработки жестов.

if (gesture.numberOfTouches != 2) { // code here to end pinching }

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

...