UISwipeGestureRecognizer @selector não está sendo chamado devido à configuração do UIPanGestureRecognizer
-
21-12-2019 - |
Pergunta
No meu aplicativo iOS, tenho a seguinte configuração:
- (void)setupGestures
{
UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
[self.view addGestureRecognizer:panRecognizer];
UISwipeGestureRecognizer* swipeUpRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
[swipeUpRecognizer setDirection:UISwipeGestureRecognizerDirectionUp];
[self.view addGestureRecognizer:swipeUpRecognizer];
}
// then I have following implementation of selectors
// this method supposed to give me the length of the swipe
- (void)panGesture:(UIPanGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateBegan)
{
startLocation = [sender locationInView:self.view];
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
CGPoint stopLocation = [sender locationInView:self.view];
CGFloat dx = stopLocation.x - startLocation.x;
CGFloat dy = stopLocation.y - startLocation.y;
CGFloat distance = sqrt(dx*dx + dy*dy );
NSLog(@"Distance: %f", distance);
}
}
// this method does all other actions related to swipes
- (void)handleSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
UISwipeGestureRecognizerDirection direction = [gestureRecognizer direction];
CGPoint touchLocation = [gestureRecognizer locationInView:playerLayerView];
if (direction == UISwipeGestureRecognizerDirectionDown && touchLocation.y > (playerLayerView.frame.size.height * .5))
{
if (![toolbar isHidden])
{
if (selectedSegmentIndex != UISegmentedControlNoSegment)
{
[self dismissBottomPanel];
}
else
{
[self dismissToolbar];
}
}
}
}
então o problema é que handleSwipe nunca é chamado ... quando comento a configuração do UIPanGestureRecognizer, o handleSwipe começa a funcionar.
Sou muito novo na programação de reconhecimento de gestos, então presumo que esteja faltando algo fundamental aqui.
Qualquer tipo de ajuda é muito apreciada!
Solução
Você precisa dizer aos gestos como interagir entre si.Isso pode ser feito deixando-os rodar ao mesmo tempo (o padrão é que não o façam) ou configurando um para funcionar somente se o outro falhar.
Para fazer com que ambos funcionem, faça da sua aula o delegate
pelos gestos e implementar
– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
para retornar YES
.
Para definir um para funcionar apenas se o outro falhar, use requireGestureRecognizerToFail:
.
Outras dicas
Os gestos de deslizar e deslocar são muito semelhantes e isso causa confusão,
Existem alguns remédios:
Não configure o movimento panorâmico e o deslizamento na mesma visualização - ele pode ser definido em subvisualizações diferentes para evitar confusões.
Use outro reconhecedor para deslizar para alternar como um toque duplo ou um toque de 2 dedos, pois isso não pode ser interpretado como uma panorâmica
Use o Método Delegado - GestureCognizer: Deveri que não tenha sido criado para obter o TestureReCognizer:
por exemplo, para chaco se os toques começaram na área do painel/barra de ferramentas e falharam no reconhecedor de pan permitindo o uso do furto.