2016-04-08 5 views
0

Was ich tun möchte, ist ein UIView oben auf einem anderen UIView setzen, und beide von ihnen sind Bildschirmgröße. Die obere UIView enthält viele Cocos-Knoten und wird reagieren, wenn ich sie berühre. Aber wenn ich einen Ort berühre, der keinen Cocos-Knoten hat, sollte der untere UIView antworten. Ich weiß nicht, wie das geht. Mein Vorstellungsvermögen ist zu überprüfen, ob oben uiView behandelt wird, berühre nichts. anderenfalls lassen Sie den unteren UIView starten zu reagieren. Aber ich weiß nicht, wie ich das überprüfen soll. Ich weiß nur, wie man Berührung kontrolliert, aber es scheint, dass die UIView auch berührt wird, wenn ich einen Platz berühre, den es nicht behandeln kann.überprüfen, ob ein uiView Touch behandelt

+0

Sie, dass mit einem UIView erreichen können, die andere UIViews auf sie. Keine Notwendigkeit für 2 UIViews als Kern von Anfang an. –

+0

Danke! Ich habe versucht, die obere Ansicht als "subView" der unteren Ansicht hinzuzufügen, aber ich kann die untere Ansicht immer noch nicht berühren. Vielleicht, weil es einige unsichtbare Ebenen in der Draufsicht gibt, die die Berührung behandeln und blockieren? –

Antwort

1

Ich denke, dass Sie nicht 2 Ansichten benötigt.

Nehmen Sie nur eine Ansicht und fügen Sie alle Ihre Knoten zu dieser Ansicht hinzu.

in .h

IBOutlet UIView *bgView;//your view 

UITapGestureRecognizer *viewTapRecognizer;// view tap recognizer 

in .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.........."); 
    } 
} 

bereits. es könnte für dich arbeiten.

+0

@AndrewRomanov Bitte überprüfen Sie den Code zuerst ich füge UITapGestureRecognizer für jeden Knoten hinzu. also bitte vorher nachfragen. – Shreyank

+0

@AndrewRomanov es ist nicht erforderlich, den Code zu ändern. – Shreyank

0

Sie können es durch zwei Wege erreichen: pointInside... Methode oder hitTest... Methode.
Wenn Sie pointInside ... verwenden, können Sie nur Ihre Ansichten verwenden (die Ansicht von oben und die Ansicht von unten). Sie werden UIView mit der Draufsicht ableiten und pointInside ... Methode überschreiben. Sie geben YES zurück, wenn der Benutzer einen Kakao-Knoten angetippt hat, andernfalls gibt NO zurück.

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

Wenn Sie komplexere Logik wollen, sollten Sie dritte Ansicht, Unterklasse von UIView (der Container-Ansicht) verwenden, die die Draufsicht und die Unteransicht enthalten sein. Überschreiben Sie die Methode hitTest ... und geben Sie die Ansicht von unten oder von oben zurück.

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

    return result; 
} 

UPD Beispiel Implementierung von didUserTapCocoaNode mit Pseudo-Code:

- (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

danke für Ihren Code. aber wie überprüft man 'didUserTapCocoaNode'? –

+0

Ich habe meine Antwort mit Pseudocode Beispiel aktualisiert. Die Hauptidee besteht darin, alle Knoten aufzulisten, während Sie den berührten Knoten nicht finden. p.s. Was ist ein Kakao-Knoten, ist es eine Unterklasse von UIView oder ein abstraktes Objekt? –