Preciso implementar um recurso que invocará algum código quando eu tocar duas vezes em self.view (visualização de UIViewCotroller
). Mas o problema é que tenho outro objeto de IU nesta visualização e não quero anexar nenhum objeto reconhecedor a todos eles. Encontrei esse método abaixo de como fazer gestos na minha vista e sei como funciona. No momento, estou diante do handicap de qual forma devo escolher para criar este reconhecedor ignorando a subvisão. Alguma ideia? Obrigado.
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[self.view addGestureRecognizer:doubleTap];
ios
uitapgesturerecognizer
Matrosov Alexander
fonte
fonte
Respostas:
Você deve adotar o
UIGestureRecognizerDelegate
protocolo dentro doself
objeto e chamar o método abaixo para verificar a visualização. Dentro deste método, compare sua visãotouch.view
e retorne o bool apropriado (Sim / Não). Algo assim:Edit: Por favor, verifique também a resposta de @ Ian!
Swift 5
fonte
-[UIGestureRecognizer requireGestureRecognizerToFail:]
mas pode funcionar sem mod'-losif
teste falhar, sua implementação falhará em retornar um BOOL; para o estilo apropriado, retorne YES após um bloco if (usando{ }
) ou em umelse
branch. Obrigado, porém, me poupou um pouco de leitura.Outra abordagem é apenas comparar se a visualização do toque é a visualização de gestos, pois os descendentes não passarão na condição. Uma linha simples e agradável:
fonte
E para a variante Swift:
É bom saber que
isDescendantOfView
retorna umBoolean
valor indicando se o receptor é uma subvisão de uma determinada visão ou idêntico a essa visão.fonte
Com o Swift 5 e iOS 12,
UIGestureRecognizerDelegate
tem um método chamadogestureRecognizer(_:shouldReceive:)
.gestureRecognizer(_:shouldReceive:)
tem a seguinte declaração:O código completo abaixo mostra uma possível implementação para
gestureRecognizer(_:shouldReceive:)
. Com este código, um toque em uma subvisão daViewController
visão do (incluindoimageView
) não acionará oprintHello(_:)
método.Uma implementação alternativa de
gestureRecognizer(_:shouldReceive:)
pode ser:Observe, entretanto, que este código alternativo não verifica se
touch.view
é uma subvisão degestureRecognizer.view
.fonte
Solução rápida completa (delegado deve ser implementado E definido para reconhecedor (es)):
fonte
Variante usando CGPoint que você toca (SWIFT 4.0)
fonte
Caminho rápido e claro
fonte
Observe que a API GestRecognizer mudou para:
gestoRecognizer (_: shouldReceive :)
Observe especialmente o indicador de sublinhado (pular) para o rótulo externo do primeiro parâmetro.
Usando muitos dos exemplos fornecidos acima, eu não estava recebendo o evento. Abaixo está um exemplo que funciona para as versões atuais do Swift (3+).
fonte
Além das soluções acima, não se esqueça de verificar
User Interaction Enabled
sua visão secundária.fonte
Tive que evitar o gesto na visão infantil. A única coisa que funcionou foi permitir e manter a primeira visualização e evitar o gesto em todas as próximas visualizações:
fonte
Swift 4:
touch.view
agora é opcional, portanto, com base na resposta de @Antoine:fonte
Se você não quiser que seu 'identificador de toque duplo' entre em conflito com seus botões e / ou outros controles, você pode definir
self
comoUIGestureRecognizerDelegate
e implementar:fonte