2009-08-17 2 views
0

Ich habe eine große UIView, die auf Berührungen reagiert, und sie ist mit vielen kleinen UIViews bedeckt, die unterschiedlich auf Berührungen reagieren. Ist es möglich, überall auf dem Bildschirm zu berühren und herumzurutschen, und jede Ansicht weiß, ob sie berührt wird?Kann ich erkennen, ob eine höhere Teilansicht berührt wurde?

Zum Beispiel, legte ich meinen Finger nach oben links und gleiten nach unten rechts. Die touchesBegan/Moved wird von der baseView gesammelt. Wenn ich itemView1, itemView2 und itemView3 überlasse, wird die Steuerung an sie übergeben. Wenn ich mit dem Finger über itemView2 hebe, wird die touchsEnded-Methode von itemView2 ausgeführt. Wenn ich meinen Finger über keines der Elemente hebe, führt dies buildViews touchedEnded aus.

Im Moment, wenn ich auf baseView aufsetze, ist touchEnded immer baseView und die höheren itemViews werden ignoriert.

Irgendwelche Ideen?

Antwort

1

Wenn ich das richtig verstehe, wird das touchsEnded-Ereignis erkannt, aber nicht von der Subview, die darüber informiert werden muss. Ich denke, das könnte für Sie funktionieren:

In einer gemeinsamen Datei, definieren TOUCHES_ENDED_IN_SUPERVIEW als @ "Berührungen in Superview beendet".

Im touchesEnded Verfahren der enthaltenden Ansicht, dass Brennen,

[[NSNotificationCenter defaultCenter] postNotificationName: TOUCHES_ENDED_IN_SUPERVIEW object: self]; 

Im touchesBegan der Subviews, fügen

[[NSNotificationCenter defaultCenter] addObserver: self 
    selector: @selector(touchesEnded:) 
    name: TOUCHES_ENDED_IN_SUPERVIEW 
    object: self.superview]; 

In den touchesEnded Methoden der Subviews, Verwendung Ihre normale Logik für das Ereignis, und fügen Sie auch

[[NSNotificationCenter defaultCenter] removeObserver: self name: TOUCHES_ENDED_IN_SUPERVIEW object: self.superview]; 

Denken Sie daran, [[NSNotificationCenter defaultCenter] removeObserver: self] auch in Ihren Dealloc zu setzen, falls es möglich ist, die Seite zu verlassen, ohne das touchSended-Ereignis zu erhalten.

Sie möchten vielleicht, dass die Benachrichtigung ihre Nachricht an eine spezielle touchSendedInSuperview-Methode sendet, die toustsEnded selbst aufruft, aber das hängt davon ab, ob Sie in diesem Fall eine spezielle Verarbeitung durchführen müssen.

+0

Dank Amagrammer, ich werde diese ein Schuss. Es klingt gut für mich, aber ich habe seitdem meinen Code geschnitten, um das vorerst nicht zu tun, und ich möchte diese Tore nicht wieder öffnen. Wenn es funktioniert, werde ich dich sicher wissen lassen. –

0

Sie können so etwas wie folgt verwenden:


-(void)touchesEnded: (NSSet *)touches 
      withEvent: (UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView: touch.view]; 
    if (CGRectContainsPoint(control1.frame, location)) { 
     [self control1Action]; 
    } else if (CGRectContainsPoint(control2.frame, location)) { 
     [self control2Action]; 
    } 
}