Tenho uma vista sobreposta a muitas outras. Estou usando apenas a overaly para detectar alguns toques na tela, mas, além disso, não quero que a exibição pare o comportamento de outras exibições abaixo, que são visualizações de rolagem, etc. Como posso encaminhar todos os toques através essa visão de sobreposição? É um subescala do UIView.
141
Respostas:
Desativar a interação do usuário era tudo o que eu precisava!
Objetivo-C:
Rápido:
fonte
myWebView.isUserInteractionEnabled = false
Para passar toques de uma vista de sobreposição para as vistas abaixo, implemente o seguinte método no UIView:
Objetivo-C:
Swift 5:
fonte
Este é um tópico antigo, mas surgiu em uma pesquisa, então pensei em adicionar meu 2c. Eu tenho um UIView de cobertura com sub-visualizações e só quero interceptar os toques que atingem uma das sub-visualizações. Por isso, modifiquei a resposta do PixelCloudSt para
fonte
Versão aprimorada da resposta @fresidue. Você pode usar essa
UIView
subclasse como vista transparente passando toques fora de sua subvisão. Implementação no objetivo C :.
e em Swift:
DICA:
Digamos que você tenha um grande painel "suporte", talvez com uma vista de mesa por trás. Você faz o painel "titular"
PassthroughView
. Agora funcionará, você pode rolar a tabela "através" do "suporte".Mas!
Na parte superior do painel "suporte", existem alguns rótulos ou ícones. Não se esqueça, é claro que essas devem ser simplesmente marcadas como interação do usuário ativada como OFF!
Na parte superior do painel "suporte", você tem alguns botões. Não se esqueça, é claro que essas devem simplesmente ser marcadas como interação do usuário ativada!
Observe que, de maneira um tanto confusa, o próprio "suporte" - a visualização em que você usa
PassthroughView
- deve estar marcado como Ativado ! Isso é ON !! (Caso contrário, o código no PassthroughView simplesmente nunca será chamado.)fonte
$0.isUserInteractionEnabled
Eu tive um problema semelhante com um UIStackView (mas poderia ser qualquer outro modo de exibição). Minha configuração foi a seguinte:
É um caso clássico em que eu tenho um recipiente que precisava ser colocado em segundo plano, com botões ao lado. Para fins de layout, incluí os botões em um UIStackView, mas agora a parte do meio (vazia) do stackView intercepta toques :-(
O que fiz foi criar uma subclasse de UIStackView com uma propriedade que define o subView que deve ser tocável. Agora, qualquer toque nos botões laterais (incluído na matriz * viewsWithActiveTouch *) será dado aos botões, enquanto qualquer toque no stackview em qualquer outro lugar que não seja esse ponto de vista não será interceptado e, portanto, transmitido para o que estiver abaixo da pilha Visão.
fonte
Se a visualização para a qual você deseja encaminhar os toques não for uma subview / superview, você poderá configurar uma propriedade customizada em sua subclasse UIView da seguinte forma:
Certifique-se de sintetizá-lo no seu .m:
E inclua o seguinte em qualquer um dos seus métodos UIResponder, como:
Sempre que você instancia sua UIView, defina a propriedade forwardableTouchee para qualquer visualização que você deseja que os eventos sejam encaminhados:
fonte
No Swift 5
fonte
Eu precisava passar detalhes através de um UIStackView. Uma UIView dentro era transparente, mas o UIStackView consumia todos os toques. Isso funcionou para mim:
Todas as Subviews arranjadas ainda recebem toques, mas os toques no próprio UIStackView passaram pela visualização abaixo (para mim, um mapView).
fonte
Parece que mesmo com muitas respostas aqui, não há ninguém tão rápido que eu precisei. Então, peguei a resposta do @fresidue aqui e a converti para rápida, pois é o que agora a maioria dos desenvolvedores deseja usar aqui.
Ele resolveu o meu problema, onde eu tenho uma barra de ferramentas transparente com o botão, mas quero que a barra de ferramentas fique invisível para o usuário e os eventos de toque devem passar.
isUserInteractionEnabled = false, como indicado anteriormente, não é uma opção baseada nos meus testes.
fonte
Eu tinha alguns rótulos dentro do StackView e não tive muito sucesso com as soluções acima. Em vez disso, resolvi meu problema usando o código abaixo:
Subclasse UIStackView:
Então você pode fazer algo como:
fonte
Tente algo assim ...
O código acima, no seu método touchesBegan, por exemplo, passaria os toques para todas as subvisões de exibição.
fonte
A situação que eu estava tentando fazer era criar um painel de controle usando controles dentro do UIStackView aninhado. Alguns dos controles tinham outros UITextField com UIButton. Além disso, havia rótulos para identificar os controles. O que eu queria fazer era colocar um grande botão "invisível" atrás do painel de controle, para que, se um usuário tocasse em uma área fora de um botão ou campo de texto, ele pudesse capturá-lo e tomar uma ação - principalmente descartar qualquer teclado se um texto O campo estava ativo (resignFirstResponder). No entanto, tocar em uma etiqueta ou outra área em branco no painel de controle não passaria nada. As discussões acima foram úteis para apresentar minha resposta abaixo.
Basicamente, classifiquei o UIStackView e substitui a rotina "point (inside: with) para procurar o tipo de controle que precisava do toque e" ignorar "coisas como etiquetas que eu queria ignorar. Ele também verifica se há dentro do UIStackView, para que as coisas possam voltar à estrutura do painel de controle.
O código é talvez um pouco mais detalhado do que deveria ser. Mas foi útil na depuração e, esperançosamente, fornece mais clareza no que a rotina está fazendo. Apenas certifique-se de que no Interface Builder altere a classe do UIStackView para PassThruStack.
}
fonte
Conforme sugerido pelo @PixelCloudStv, se você deseja tocar o assunto de uma visualização para outra, mas com algum controle adicional sobre esse processo - subclasse UIView
//cabeçalho
//implementação
Depois, no interfaceBuilder, basta definir a classe de exibição como TouchView e definir ret ativo com seu ret. Também você pode mudar e implementar outra lógica.
fonte