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
Répondre
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.
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;
}
merci pour votre code. mais comment vérifier 'didUserTapCocoaNode'? –
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? –
Vous pouvez y parvenir avec un UIView qui a d'autres UIViews sur elle. Pas besoin de 2 UIViews comme base pour commencer. –
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? –