web-dev-qa-db-fra.com

Comment obtenir des interventions lorsque la vue parent a userInteractionEnabled défini sur NO 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.

Est-il possible d’obtenir des événements tactiles dans les sous-vues?

41
subchap

Pour que la vue laisse passer les contacts, mais que ses sous-vues soient gérées, laissez userInteractionEnabled sur cette vue sur YES et utilisez plutôt 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

74
Nikso

La définition de la propriété userInteractionEnabled de la vue parent sur NO définit également implicitement ses propriétés userInteractionEnabled de sous-vues sur NO. Je ne connais pas de moyen d'obtenir des événements tactiles dans la sous-vue à l'aide de l'approche que vous avez décrite, mais vous pouvez peut-être créer une vue qui recouvre simplement les vues avec lesquelles vous souhaitez que les utilisateurs interagissent, mais qui n'est pas le parent de celles vues.

4
mblPrgr

Solution rapide - Vous devez avoir une classe de vue personnalisée pour la vue parent et y ajouter le code suivant. Laissez 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
        }
    }
}
0
Syed Zahid Shah