Meu problema: eu tenho uma supervisualização EditView
que ocupa basicamente todo o quadro do aplicativo e uma subvisualização MenuView
que ocupa apenas ~ 20% da parte inferior, e então MenuView
contém sua própria subvisualização ButtonView
que na verdade reside fora dos MenuView
limites de (algo como isto ButtonView.frame.origin.y = -100
:).
(observação: EditView
possui outras subvisualizações que não fazem parte da MenuView
hierarquia de visões de, mas podem afetar a resposta.)
Você provavelmente já conhece o problema: quando ButtonView
está dentro dos limites de MenuView
(ou, mais especificamente, quando meus toques estão dentro MenuView
dos limites de), ButtonView
responde a eventos de toque. Quando meus toques estão fora dos MenuView
limites de (mas ainda dentro ButtonView
dos limites de), nenhum evento de toque é recebido por ButtonView
.
Exemplo:
- (E) é
EditView
, o pai de todas as visualizações - (M) é
MenuView
uma subvisão de EditView - (B) é
ButtonView
uma subvisão do MenuView
Diagrama:
+------------------------------+
|E |
| |
| |
| |
| |
|+-----+ |
||B | |
|+-----+ |
|+----------------------------+|
||M ||
|| ||
|+----------------------------+|
+------------------------------+
Como (B) está fora do quadro de (M), um toque na região (B) nunca será enviado para (M) - na verdade, (M) nunca analisa o toque neste caso, e o toque é enviado para o próximo objeto na hierarquia.
Objetivo: presumo que substituir hitTest:withEvent:
pode resolver esse problema, mas não entendo exatamente como. No meu caso, deve hitTest:withEvent:
ser sobrescrito em EditView
(minha supervisão 'master')? Ou deveria ser sobrescrito na MenuView
visualização direta do botão que não está recebendo toques? Ou estou pensando sobre isso incorretamente?
Se isso exigir uma explicação longa, um bom recurso online seria útil - exceto os documentos UIView da Apple, que não deixaram isso claro para mim.
Obrigado!
fonte
Ok, eu fiz algumas escavações e testes, veja como
hitTest:withEvent
funciona - pelo menos em um nível alto. Imagine este cenário:Diagrama:
Como (B) está fora do quadro de (M), um toque na região (B) nunca será enviado para (M) - na verdade, (M) nunca analisa o toque neste caso, e o toque é enviado para o próximo objeto na hierarquia.
No entanto, se você implementar
hitTest:withEvent:
em (M), os toques em qualquer lugar no aplicativo serão enviados para (M) (ou pelo menos ele sabe sobre eles). Você pode escrever um código para lidar com o toque nesse caso e retornar o objeto que deve receber o toque.Mais especificamente: o objetivo do
hitTest:withEvent:
é devolver o objeto que deve receber o golpe. Então, em (M) você pode escrever código como este:Eu ainda sou muito novo neste método e neste problema, então se houver maneiras mais eficientes ou corretas de escrever o código, por favor, comente.
Espero que isso ajude quem responder a essa pergunta mais tarde. :)
fonte
Em Swift 5
fonte
O que eu faria é ter o ButtonView e o MenuView existindo no mesmo nível na hierarquia de exibição, colocando-os em um contêiner cujo quadro se ajusta completamente a ambos. Desta forma, a região interativa do item recortado não será ignorada por causa dos limites de sua supervisão.
fonte
Se você tiver muitas outras subvisualizações dentro de sua visão pai, provavelmente a maioria das outras visões interativas não funcionaria se você usar as soluções acima, nesse caso, você pode usar algo como isto (no Swift 3.2):
fonte
Se alguém precisar, aqui está a alternativa rápida
fonte
Coloque as linhas de código abaixo em sua hierarquia de visualização:
Para maiores esclarecimentos, foi explicado em meu blog: "goaheadwithiphonetech" sobre "Texto explicativo personalizado: o botão não é clicável."
Espero que isso te ajude...!!!
fonte