Porque isso está acontecendo?
Isso ocorre porque quando sua subvisualização está fora dos limites de sua supervisão, os eventos de toque que realmente acontecem nessa subvisualização não serão entregues a ela. No entanto, ele vai ser entregue ao seu superview.
Independentemente de as subvisualizações serem ou não recortadas visualmente, os eventos de toque sempre respeitam o retângulo de limites da supervisualização de destino. Em outras palavras, eventos de toque que ocorrem em uma parte de uma visualização que está fora do retângulo de limites da visualização não são entregues a essa visualização. Ligação
O que você precisa fazer?
Quando seu superview receber o evento de toque mencionado acima, você precisará informar ao UIKit explicitamente que meu subview deve ser o único a receber este evento de toque.
E quanto ao código?
Em sua visão geral, implemente func hitTest(_ point: CGPoint, with event: UIEvent?)
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if isHidden || alpha == 0 || clipsToBounds { return super.hitTest(point, with: event) }
// convert the point into subview's coordinate system
let subviewPoint = self.convert(point, to: subview)
// if the converted point lies in subview's bound, tell UIKit that subview should be the one that receives this event
if !subview.isHidden && subview.bounds.contains(subviewPoint) { return subview }
return super.hitTest(point, with: event)
}
Fascinante gotchya: você deve ir para a "visão superior muito pequena"
Você tem que ir "para cima" até a visão "mais elevada", da qual a visão do problema está fora.
Exemplo típico:
Digamos que você tenha uma tela S, com uma visualização de contêiner C. A visualização do controlador de visualização de contêiner é V. (Lembre-se de que V ficará dentro de C e terá o mesmo tamanho.) V tem uma subvisualização (talvez um botão) B. B é o problema vista que está realmente fora de V.
Mas observe que B também está fora de C.
Neste exemplo você tem que aplicar a solução override hitTest
de fato para C, para não V . Se você aplicá-lo a V - não faz nada.