Desejo adicionar um simples reconhecimento de gesto de furto ao meu projeto de iPhone baseado em exibição. Gestos em todas as direções (direita, baixo, esquerda, cima) devem ser reconhecidos.
É indicado nos documentos para UISwipeGestureRecognizer:
Você pode especificar várias direções especificando várias constantes UISwipeGestureRecognizerDirection usando operandos OR bit a bit. A direção padrão é UISwipeGestureRecognizerDirectionRight.
No entanto, para mim, isso não funciona. Quando todas as quatro direções são OR'ed, apenas desliza para a esquerda e para a direita.
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
Corrigi isso adicionando quatro reconhecedores à exibição, mas estou curioso para saber por que não funcionou como anunciado nos documentos?
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
ios
iphone
swipe
uiswipegesturerecognizer
sandisn
fonte
fonte
Respostas:
Parece que há um erro. Você pode especificar as direções permitidas como você fez. Porém, ao tentar acessar a direção real que acionou o furto no método seletor de ações, você ainda obtém a máscara de bit que definiu originalmente (para as direções permitidas).
Isso significa que as verificações da direção real sempre falham quando mais de 1 direção é permitida. Você pode vê-lo com bastante facilidade quando gera o valor de 'direction' no método seletor (ou seja
-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer
).Arquivou um relatório de bug (# 8276386) na Apple.
[Atualização] Eu recebi uma resposta da Apple dizendo que o comportamento funciona conforme o planejado.
Assim, por exemplo, em uma exibição de tabela, você pode deslizar para a esquerda ou direita em uma célula da exibição de tabela para acionar 'excluir' (isso teria as direções do gesto de deslizamento definidas para esquerda e direita)
Isso significa que a solução original é a maneira como deve ser usada. A propriedade direction pode ser usada apenas para obter os gestos reconhecidos corretamente, mas não no método executado em um reconhecimento bem-sucedido para comparar com a direção real que acionou o reconhecimento.
fonte
Percebi que os gestos esquerdo / direito e para cima / para baixo funcionam juntos em pares, então você só precisa especificar dois reconhecedores de gestos. E os documentos parecem estar errados.
fonte
Bem, isso é péssimo, resolvi o problema adicionando 2 gestos como o Lars mencionado e que funcionaram perfeitamente ...
1) Esquerda / Direita 2) Cima / Baixo
fonte
Agora esta é a função didSwipe
fonte
Se você estiver usando o Xcode 4.2, poderá adicionar Gesture Recognizers @ no storyboard e vincular os GUI Gesture Recognizers às IBActions.
Você pode encontrar os reconhecedores de gestos na biblioteca de objetos do painel Utilitário (parte inferior do painel Direito).
Então é apenas uma questão de arrastar o controle para a ação apropriada.
fonte
Se você quiser detectar todas as quatro direções, precisará criar quatro instâncias, como fez em sua solução alternativa.
Eis o porquê : A mesma instância do UISwipeGestureRecognizer que você cria é a instância que é passada ao seletor como remetente. Portanto, se você configurá-lo para reconhecer todas as quatro direções, ele retornará verdadeiro para
sgr.direction == xxx
onde xxx é qualquer uma das quatro direções.Aqui está uma solução alternativa que envolve menos código (assume o uso do ARC):
fonte
Aqui está um exemplo de código para o uso do UISwipeGestureRecognizer. Anote comentários.
swipeRight e swipeLeft são métodos usados para executar atividades específicas com base na passagem para a esquerda ou direita. Por exemplo:
fonte
fonte
Swift 2.1
Eu tive que usar o seguinte
fonte
hmm, estranho, funciona perfeito para mim, faço exatamente a mesma coisa
acho que você deveria tentar olhar
Método UIGestureRecognizerDelegate
nos logs, você deve ver algo como:
deveria começar gesto; target = <(action = actionForUpDownSwipeGestureRecognizer :, target =)>; direction = cima, baixo, esquerda, direita>
fonte
use isso, deve ser a operação bit
fonte
Isso estava me deixando louco. Finalmente, descobri uma maneira confiável de ter vários swipeGestureRecognizers.
Parece que há um erro no iOS se o nome do seu seletor de "ação" for o mesmo em vários swipeGestureRecognizers. Se você apenas os nomear de maneira diferente, por exemplo, handleLeftSwipeFrom e handleRightSwipeFrom, tudo funcionará.
fonte