2016-04-08 1 views
0

Ce que je veux faire est de mettre un UIView sur un autre UIView, et les deux sont de taille d'écran. Le top UIView comprend beaucoup de nœuds cocos et répondra quand je les toucherai. Mais quand je touche un endroit qui n'a pas de noeud cocos, le fond UIView devrait répondre. Je ne sais pas comment faire. Mon imagine est de vérifier si top uiView est manipulé tactile, ne rien faire. Sinon, laissez le fond UIView commencer à répondre. Mais je ne sais pas comment vérifier cela. Je sais seulement comment vérifier le contact mais il semble que le UIView soit également touché quand je touche un endroit qu'il ne peut pas manipuler.vérifier si un uiView a manipulé le toucher

+0

Vous pouvez y parvenir avec un UIView qui a d'autres UIViews sur elle. Pas besoin de 2 UIViews comme base pour commencer. –

+0

Merci! J'ai essayé d'ajouter la vue de dessus en tant que 'subView' de la vue de dessous, mais je ne peux toujours pas toucher la vue de dessous. peut-être parce qu'il ya des couches invisibles dans la vue de dessus pour gérer le toucher et le bloquer? –

Répondre

1

Je pense que vous n'avez pas besoin de 2 vues. Prenez une seule vue et ajoutez tout votre nœud à cette vue.

dans .h

IBOutlet UIView *bgView;//your view 

UITapGestureRecognizer *viewTapRecognizer;// view tap recognizer 

dans .m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    viewTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handelGesture:)]; 
    [bgView addGestureRecognizer:viewTapRecognizer]; 

    for (UIView *subView in [bgView subviews]) { 

     UITapGestureRecognizer *nodeTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handelGesture:)]; 

     [subView addGestureRecognizer:nodeTapRecognizer]; 
    } 
} 

- (void)handelGesture:(UITapGestureRecognizer*)sender { 

    if (sender == viewTapRecognizer) { 
     // your view is tapped 
     NSLog(@"........Tapped view.........."); 
    } 
    else { 
     // your node is tapped 
     NSLog(@"........Tapped node.........."); 
    } 
} 

essayer. ça pourrait marcher pour toi.

+0

@AndrewRomanov Veuillez d'abord vérifier le code que j'ajoute UITapGestureRecognizer pour chaque nœud. alors s'il vous plaît vérifier avant de voter. – Shreyank

+0

@AndrewRomanov il n'est pas nécessaire de changer de code. – Shreyank

0

Vous pouvez y arriver par 2 façons: en utilisant la méthode pointInside... ou méthode hitTest....
Si vous utilisez pointInside ... vous pouvez utiliser uniquement vos vues (la vue de dessus et la vue de dessous). Vous allez sous-classer UIView avec la vue de dessus et remplacer la méthode pointInside .... Vous retournerez OUI si l'utilisateur a tapé sur un noeud de cacao sinon NO.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    BOOL inside = [self didUserTapCocoaNode:point]; 
    return inside; 
} 

Si vous voulez une logique plus complexe, vous devez utiliser troisième point de vue, sous-classe de UIView (la vue du conteneur), qui sera contient la vue de dessus et la vue de dessous. Remplacez la méthode hitTest ... et renvoyez la vue du bas ou du haut.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView* result = nil; 
    if ([self touchedCocoaNode:point]) 
    { 
     result = self.topView; 
    } 
    else 
    { 
     result = self.bottomView; 
    } 

    return result; 
} 

UPD Exemple de mise en œuvre didUserTapCocoaNode avec le code pseudo:

- (BOOL)didUserTapCocoaNode:(CGPoint)pointInSelf 
{ 
    __block BOOL tappedSomeNode = NO; 
    [self.nodes enumerateObjectsUsingBlock:^(NodeType* obj, NSInteger idx, BOOL* stop){ 
    CGPoint pointInNode = [obj convertPoint:pointInSelf fromView:self]; 
    tappedSomeNode = [obj pointInside:pointInNode withEvent:nil]; 
    *stop = tappedSomeNode; 
    }] 
    return tappedSomeNode; 
} 
+0

merci pour votre code. mais comment vérifier 'didUserTapCocoaNode'? –

+0

J'ai mis à jour ma réponse avec un exemple de pseudo-code. L'idée principale est d'énumérer tous les nœuds alors que vous ne trouvez pas le nœud touché. p.s. Qu'est-ce qu'un noeud cacao, est-ce une sous-classe de UIView ou un objet abstrait? –