UIView clipToBounds não está impedindo um subView de receber toques fora da visualização pai

StackOverflow https://stackoverflow.com//questions/12714122

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top