Eu tenho vista com um UITapGestureRecognizer
. Então, quando toco na visualização, outra visualização aparece acima dessa visualização. Essa nova visão possui três botões. Quando agora pressiono um desses botões, não recebo a ação dos botões, apenas a ação do gesto de tocar. Portanto, não posso mais usar esses botões. O que posso fazer para obter os eventos com esses botões? O estranho é que os botões ainda são destacados.
Não posso simplesmente remover o UITapGestureRecognizer depois que recebi o toque. Porque com ele a nova visão também pode ser removida. Significa que quero um comportamento como os controles de vídeo em tela cheia .
void
que não deixe nenhuma informação em tempo de execução para uso na detecção. Mas o que você pode fazer é subir na hierarquia da exibição, testandoUIControl
e retornandoNO
se encontrar algum controle.Como acompanhamento da resposta de Casey à resposta de Kevin Ballard:
Isso basicamente faz com que todos os tipos de controles de entrada do usuário, como botões, controles deslizantes, etc. funcionem
fonte
setCancelsTouchesInView = NO
para não acionar o gesto de toque na interação com os controles. No entanto, você pode escrever melhor:return ![touch.view isKindOfClass:[UIControl class]];
Encontre esta resposta aqui: link
Você também pode usar
O que impede que o reconhecedor de torneiras seja o único a capturar todas as torneiras
UPDATE - Michael mencionou o link para a documentação que descreve esta propriedade: cancelsTouchesInView
fonte
Como acompanhamento da resposta de Kevin Ballard, tive o mesmo problema e acabei usando este código:
Ele tem o mesmo efeito, mas isso funcionará em qualquer UIButton em qualquer profundidade de exibição (meu UIButton tinha várias visualizações de profundidade e o delegado do UIGestureRecognizer não tinha uma referência a ele.)
fonte
No iOS 6.0 e posterior, as ações de controle padrão impedem a sobreposição do comportamento do reconhecedor de gestos. Por exemplo, a ação padrão para um botão é um único toque. Se você tiver um reconhecedor de gestos de toque único conectado à visualização principal de um botão e o usuário tocar no botão, o método de ação do botão receberá o evento de toque em vez do reconhecedor de gestos. Isso se aplica apenas ao reconhecimento de gestos que se sobrepõe à ação padrão de um controle, que inclui: .....
Do documento API da Apple
fonte
Essas respostas estavam incompletas. Eu tive que ler várias postagens sobre como usar essa operação booleana.
No seu arquivo * .h, adicione este
No seu arquivo * .m, adicione este
fonte
Encontrou outra maneira de fazer isso a partir daqui . Ele detecta o toque dentro de cada botão ou não.
(1) pointInside: withEvent: (2) locationInView:
fonte
Aqui está a versão Swift da resposta de Lily Ballard que funcionou para mim:
fonte
Swift 5
Botão na visão geral com tapgesture
No meu caso, implementar o hitTest funcionou para mim. Eu tive a visualização da coleção com o botão
Esse método percorre a hierarquia da visualização chamando o
point(inside:with:)
método de cada subvisão para determinar qual subview deve receber um evento de toque. Sepoint(inside:with:)
retornar true, a hierarquia da subvisão é percorrida da mesma forma até que a visualização mais à frente que contém o ponto especificado seja encontrada.fonte
Você pode impedir que o UITapGestureRecognizer cancele outros eventos (como o toque no botão) configurando o seguinte booleano:
fonte
Se o seu cenário for assim:
Você tem uma visão simples e alguns UIButtons, controles UITextField adicionados como sub-visões a essa visão. Agora, você deseja descartar o teclado ao tocar em qualquer outro lugar na exibição, exceto nos controles (sub-visualizações adicionadas)
Então a solução é:
Adicione o seguinte método ao seu XYZViewController.m (que tem sua visão)
fonte
Otimizando a resposta do cdasher, você obtém
fonte