Pourquoi cela se produit-il?
En effet, lorsque votre sous-vue se trouve en dehors des limites de votre supervision, les événements tactiles qui se produisent réellement sur cette sous-vue ne seront pas livrés à cette sous-vue. Cependant, il FERA être livré à son superview.
Indépendamment du fait que les sous-vues soient coupées visuellement ou non, les événements tactiles respectent toujours le rectangle de limites de la vue de surveillance de la vue cible. En d'autres termes, les événements tactiles se produisant dans une partie d'une vue située en dehors du rectangle de limites de sa vue supervisée ne sont pas transmis à cette vue. Lien
Qu'as tu besoin de faire?
Lorsque votre superview reçoit l'événement tactile mentionné ci-dessus, vous devrez indiquer explicitement à UIKit que ma sous-vue doit être celle qui recevra cet événement tactile.
Et le code?
Dans votre supervision, implémentez 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)
}
Gotchya fascinant: vous devez aller à la "vue la plus haute trop petite"
Vous devez aller "vers le haut" jusqu'à la vue "la plus élevée" à laquelle la vue du problème se trouve à l'extérieur.
Exemple typique:
Supposons que vous ayez un écran S, avec une vue conteneur C.La vue du contrôleur de vue conteneur est V. (Rappelez-vous que V sera placé à l'intérieur de C et aura la même taille.) V a une sous-vue (peut-être un bouton) B.B est le problème vue qui est en fait en dehors de V.
Mais notez que B est également en dehors de C.
Dans cet exemple , vous devez appliquer la solution override hitTest
en fait à C, et non à V . Si vous l'appliquez à V - cela ne fait rien.