Disons que nous avons un contrôleur de vue avec une sous-vue. la sous-vue occupe le centre de l'écran avec des marges de 100 px sur tous les côtés. Nous ajoutons ensuite un tas de petits trucs sur lesquels cliquer dans cette sous-vue. Nous n'utilisons la sous-vue que pour tirer parti du nouveau cadre (x = 0, y = 0 à l'intérieur de la sous-vue est en fait 100,100 dans la vue parente).
Ensuite, imaginez que nous avons quelque chose derrière la sous-vue, comme un menu. Je veux que l'utilisateur puisse sélectionner l'un des "petits trucs" dans la sous-vue, mais s'il n'y a rien là-bas, je veux que les touches le traversent (puisque l'arrière-plan est clair de toute façon) aux boutons derrière.
Comment puis-je faire ceci? On dirait que les touchesBegan passent, mais les boutons ne fonctionnent pas.
la source
UIButton
qui est sous un semi-transparentUIView
tandis que la partie non transparente duUIView
répondra toujours aux événements tactiles.Réponses:
Créez une vue personnalisée pour votre conteneur et remplacez le message pointInside: pour renvoyer false lorsque le point n'est pas dans une vue enfant éligible, comme ceci:
Rapide:
Objectif c:
L'utilisation de cette vue comme conteneur permettra à l'un de ses enfants de recevoir des touches, mais la vue elle-même sera transparente aux événements.
la source
J'utilise aussi
Pas besoin de sous-classe. Fonctionne très bien.
la source
De Apple:
Meilleures pratiques pour les pommes :
à la place, vous pouvez remplacer:
dans votre sous-classe UIView et renvoyez NON si vous voulez que ce contact soit envoyé dans la chaîne de répondeurs (c'est-à-dire aux vues derrière votre vue sans rien dedans).
la source
NO
;Un moyen beaucoup plus simple consiste à "Décocher" l'interaction utilisateur activée dans le générateur d'interface. "Si vous utilisez un storyboard"
la source
Sur la base de ce que John a publié, voici un exemple qui permettra aux événements tactiles de passer à travers toutes les sous-vues d'une vue, à l'exception des boutons:
la source
UIView
sousPassThroughView
- classe qui remplace simplement-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return YES; }
si vous souhaitez transférer des événements tactiles vers les vues inférieures.Dernièrement, j'ai écrit un cours qui m'aidera avec cela. L'utiliser comme classe personnalisée pour un
UIButton
ouUIView
passera les événements tactiles qui ont été exécutés sur un pixel transparent.Cette solution est un peu meilleure que la réponse acceptée car vous pouvez toujours cliquer sur un
UIButton
qui se trouve sous un semi-transparentUIView
tandis que la partie non transparente duUIView
répondra toujours aux événements tactiles.Comme vous pouvez le voir dans le GIF, le bouton Girafe est un simple rectangle mais les événements tactiles sur les zones transparentes sont transmis au jaune en
UIButton
dessous.Lien vers la classe
la source
La solution la plus votée ne fonctionnait pas pleinement pour moi, je suppose que c'était parce que j'avais un TabBarController dans la hiérarchie (comme le souligne l'un des commentaires), elle transmettait en fait des touches à certaines parties de l'interface utilisateur, mais cela dérangeait mon La capacité de tableView à intercepter les événements tactiles, ce qui a finalement été de remplacer hitTest dans la vue Je veux ignorer les touches et laisser les sous-vues de cette vue les gérer
la source
Swift 3
la source
Selon le 'Guide de programmation des applications iPhone':
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html
Mise à jour : exemple supprimé - relire la question ...
Avez-vous un traitement des gestes sur les vues qui peuvent traiter les tapotements avant que le bouton ne l'obtienne? Le bouton fonctionne-t-il lorsque vous n'avez pas de vue transparente dessus?
Des échantillons de code de code non fonctionnel?
la source
Autant que je sache, vous êtes censé pouvoir le faire en remplaçant la méthode hitTest:. Je l'ai essayé mais je n'ai pas pu le faire fonctionner correctement.
À la fin, j'ai créé une série de vues transparentes autour de l'objet palpable pour qu'elles ne le recouvrent pas. Un peu de hack pour mon problème, cela a bien fonctionné.
la source
En prenant les conseils des autres réponses et en lisant la documentation d'Apple, j'ai créé cette bibliothèque simple pour résoudre votre problème:
https://github.com/natrosoft/NATouchThroughView
Cela permet de dessiner facilement des vues dans Interface Builder qui devraient passer par une vue sous-jacente.
Je pense que le swizzling de méthode est excessif et très dangereux à faire dans le code de production, car vous dérangez directement l'implémentation de base d'Apple et apportez un changement à l'échelle de l'application qui pourrait avoir des conséquences inattendues.
Il y a un projet de démonstration et j'espère que le README fait un bon travail en expliquant ce qu'il faut faire. Pour adresser l'OP, vous devez modifier l'UIView clair qui contient les boutons en classe NATouchThroughView dans Interface Builder. Recherchez ensuite la vue UIView claire qui recouvre le menu que vous souhaitez activer. Remplacez cet UIView par la classe NARootTouchThroughView dans Interface Builder. Il peut même s'agir de l'UIView racine de votre contrôleur de vue si vous souhaitez que ces touches passent au contrôleur de vue sous-jacent. Consultez le projet de démonstration pour voir comment cela fonctionne. C'est vraiment assez simple, sûr et non invasif
la source
J'ai créé une catégorie pour ce faire.
une petite méthode swizzling et la vue est d'or.
L'en-tête
Le dossier d'implémentation
Vous devrez ajouter mon Swizz.h et Swizz.m
situé ici
Après cela, il vous suffit d'importer le UIView + PassthroughParent.h dans votre fichier {Project} -Prefix.pch, et chaque vue aura cette capacité.
chaque vue prendra des points, mais aucun des espaces vides ne le fera.
Je recommande également d'utiliser un arrière-plan clair.
ÉDITER
J'ai créé mon propre sac de propriété, et cela n'était pas inclus auparavant.
En tête de fichier
Fichier d'implémentation
la source
pointInside: withEvent:
?Si vous ne pouvez pas prendre la peine d'utiliser une catégorie ou une sous-classe UIView, vous pouvez également simplement faire avancer le bouton pour qu'il soit devant la vue transparente. Cela ne sera pas toujours possible en fonction de votre application, mais cela a fonctionné pour moi. Vous pouvez toujours ramener le bouton ou le masquer.
la source
Essaye ça
la source
Essayez de définir un
backgroundColor
de vostransparentView
commeUIColor(white:0.000, alpha:0.020)
. Ensuite, vous pouvez obtenir des événements tactiles danstouchesBegan
/touchesMoved
methods. Placez le code ci-dessous à un endroit où votre vue est ouverte:la source
J'utilise cela au lieu du point de méthode de remplacement (à l'intérieur: CGPoint, avec: UIEvent)
la source