41 votes

Comment obtenir des touches lorsque la vue parent a la valeur NO pour userInteractionEnabled dans iOS ?

Lorsque la vue parent a userInteractionEnabled=NO, ses sous-vues n'acceptent pas les événements tactiles même si leur propriété userInteractionEnabled est définie sur YES.

Existe-t-il un moyen d'obtenir des événements de contact dans les sous-vues ?

0 votes

Vous pouvez envisager cette solution : stackoverflow.com/a/35592676/913347

75voto

Nikso Points 706

Pour qu'une vue laisse passer les touches mais permette à ses sous-vues de gérer les touches, donnez à userInteractionEnabled de cette vue la valeur YES et, à la place, utilisez cet extrait :

-(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    id hitView = [super hitTest:point withEvent:event];
    if (hitView == self) return nil;
    else return hitView;
}

Source : http://cocoaheads.tumblr.com/post/2130871776/ignore-touches-to-uiview-subclass-but-not-to-its

0 votes

S'il vous plaît, décrivez comment l'utiliser. A partir d'où cette méthode doit-elle être appelée ?

0 votes

IOS Wolf : il s'agit d'une méthode UIView. developer.apple.com/library/ios/documentation/UIKit/Reference/ :

2 votes

Proposition de nom : CantTouchThisView. :)

4voto

mblPrgr Points 79

Le fait de définir la propriété userInteractionEnabled de la vue parent sur NO définit aussi implicitement les propriétés userInteractionEnabled de ses sous-vues sur NO également. Je ne connais pas de moyen d'obtenir des événements tactiles pour la sous-vue en utilisant l'approche que vous avez décrite, mais peut-être pourriez-vous créer une vue qui se superpose simplement aux vues avec lesquelles vous voulez que les utilisateurs interagissent, mais qui n'est pas le parent de ces vues.

3voto

Syed Zahid Shah Points 189

Solution Swift - Vous devez avoir une classe de vue personnalisée pour la vue parent et y ajouter le code suivant. Veuillez garder les interactions utilisateur de la vue parent activées.

J'espère que le code suivant vous aidera.

class MyCustomParentView: UIView {    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let hitView = super.hitTest(point, with: event)
        if hitView == self {
            return nil
        } else {
            return hitView
        }
    }
}

-2voto

Martin Jacob Points 63

Une solution serait de désactiver l'interaction de l'utilisateur avec les boutons, etc., plutôt que de désactiver l'interaction de l'utilisateur avec l'ensemble de la vue parent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X