2014-05-06 3 views
9

Ich habe folgendes Setup.Wie übergebe ich das Touch-Ereignis an Superview, wenn userInteractionEnabled = YES?

+- XXXCustomControl : UIControl -------+ 
| A         | 
| +- ContentView -------------------+| 
| |         || 
| | B        || 
| |         || 
| +---------------------------------+| 
+--------------------------------------+ 

Ein XXXCustomControl, das eine Unterklasse von UIControl ist. Es enthält eine Unteransicht namens contentView vom Typ UIView mit einer Größe, die kleiner ist als der Bereich des Steuerelements. Diese Ansicht hat .userInteractionEnabled = YES;

Ich muss diese Eigenschaft auf YES gesetzt haben, weil horizontale scrollviews hin und wieder eingefügt werden und sie scrollbar sein müssen. Wenn der Superview (in unserem Fall die Inhaltsansicht keine Benutzerinteraktion zulassen würde, wird dies von den Subviews übernommen.) Aber gleichzeitig muss dieses XXXCustomControl tappbar sein, wenn es in seiner Inhaltsansicht keinen scrollview nicht nur in Bereich A, sondern enthält auch in Gebiet B.

So habe ich eine „Interessenkonflikt“ hier, weil ich entweder

1), um den Inhalt Ansicht verwenden userInteractionEnabled = NO, dann kann ich die leere Kontrolle im Inhaltsanzeigebereich tippen beide in A und B, aber die scrollviews, die ich dort setze, werden nicht scrollbar sein.

2) setze die Inhaltsansicht zu userInteractionEnabled = YES aber dann, wenn die Kontrolle leer ist, Ich kann nur auf Bereich A tippen, um ein Berührungsereignis auszulösen.

Eine Idee, die ich gefunden habe, ist, dass ich die Eigenschaft standardmäßig auf NO gesetzt habe und wenn ich die contentView bevölkere, setze ich sie auf yes. Wenn ich den ContentView lösche, setze ich die Eigenschaft zurück auf Nein. Grundsätzlich möchte ich, dass dies die ganze Zeit auf "yes" gesetzt wurde, und wenn es leer ist, erzwinge die contentView, das Ereignis "touchUpInside" an seine Superansicht zu übergeben.

Ist das möglich?

+1

Wenn Sie nur tippen egal warum nicht ein GestureRecognizer der Ansicht Kind hinzufügen, die Aktion ist ist das gleiche wie der Gestenerkennung in der Elternansicht? Das scheint die einfachste Implementierung zu sein. – Putz1103

+0

Warum haben Sie keine Antwort vergeben? Michaels funktioniert für mich ... –

+0

Besser spät als nie ... –

Antwort

13

Sie könnten versuchen, die pointInside:withEvent: Methode in Ihrer inneren Ansicht zu überschreiben. Dies ermöglicht es Ihnen NO zurückzukehren, wenn Sie berührt, um den Super weiterleiten möchten:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if(/* You have content, and you want to receive touches */){ 
     return YES; 
    }else{ 
     return NO; 
    } 
} 
+0

Das funktioniert auch gut für eine Ansicht, die in einer Containeransicht enthalten ist - damit einige Steuerelemente in der (Super-) Containeransicht vorhanden sind. Einfach durch die Subview-Frames hindurchgehen - wenn kein Treffer, dann NEIN zurücksenden –

3

Sie Unterklasse können Ihre Subview und implementieren

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!touchedContent) { 
     [[self nextResponder] touchesBegan:touches withEvent:event]; 
    } else { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 
0

Sie ein anderes UIView verwenden können, zu „verstecken“ die subview .

* Details: Diese UIView ist das Geschwister der Unteransicht. Es hat die gleiche Größe und Position Ihrer Unteransicht mit Hintergrundfarbe der klaren Farbe.

* Erklären: Die neue UIView nimmt die Berührung und übergibt sie automatisch an die Superview.

Auf diese Weise muss Ihre Subview nicht unterklassifiziert werden - es handelt sich um eine Storyboard-Lösung.
Bitte versuchen Sie es. Habe Spaß!

0

verwenden in super Blick, ohne Subviews Code ändern (da Subviews kann von anderen Frameworks oder Hülsen eingeführt werden):

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *view = [super hitTest:point withEvent:event]; 
    if ([view isDescendantOfView:self]) 
    { 
     NSLog(@"touched inside"); 
    } 
    return view; 
}