UIView clipToBounds não está impedindo um subView de receber toques fora da visualização pai
-
13-12-2019 - |
Pergunta
Eu tenho dois UIViews.Estou usando um para conter o outro para poder deslizar um dentro do outro.Estou encontrando um problema em que, embora um subView seja cortado nos limites de seu pai, ele ainda recebe eventos de toque e bloqueia o acesso a outras visualizações subjacentes.
Tenho três capturas de tela que mostram o layout.Pintei o pai de verde e o filho de vermelho.
A ideia é que o usuário clique em “Visualizar” e o subView deslize para cima.Quando o subView está na posição padrão, o UITabBar é coberto e não pode ser clicado.Você pode ver isso na primeira imagem onde a visualização vermelha está presente na parte inferior.Quando o subView é movido para o topo, o UITabBar pode ser clicado, pois agora está visível.Na terceira imagem, mostro como é com clipToBounds habilitado no UIView verde.
Habilitei clipToBounds, então não consigo entender por que o subView está bloqueando o UITabBar subjacente.Meu entendimento de clipToBounds está completamente errado?
Solução
O uso de clipToBounds afeta apenas o layout visual de um subView, não o layout lógico.Isso significa que embora meu subView não seja visível a olho nu, é visível ao toque.
Resolvi esse problema animando o tamanho do subView em vez de sua posição.No meu código abaixo, stationProximityView é o subView.Eu animo seu tamanho em 40 pixels para trazer o título preto de volta à visualização.
[UIView beginAnimations:@"stationProximityBar" context:NULL];
self.stationProximityView.view.frame = CGRectOffset(self.stationProximityView.view.frame, 0, -40);
[UIView commitAnimations];
Quando não preciso mais dele, eu o animo fora de vista.
[UIView beginAnimations:@"stationProximityBar" context:NULL];
self.stationProximityView.view.frame = CGRectMake(0 ,0, 320, 500);
[UIView commitAnimations];
Se o usuário tocar no botão de visualização, toda a subView será mostrada:
[UIView beginAnimations:@"stationProximityBar" context:NULL];
self.stationProximityView.view.frame = CGRectMake(0,460,320,40);
[UIView commitAnimations];
A dispensa faz com que a visualização fique oculta da mesma forma que a barra pequena.
[UIView beginAnimations:@"hideStationProximityBar" context:NULL];
self.stationProximityView.view.frame = CGRectMake(0,0,320,500);
[UIView commitAnimations];
No momento, esse código está sendo testado apenas no iPhone 5, portanto, a altura codificada de 500 causaria problemas em modelos anteriores de iPhone.