2010-03-29 17 views
14

Ich versuche festzustellen, ob ein UILabel berührt wurde und wenn ja, etwas tun. Gib ..Wie kann ich feststellen, ob ein UILabel berührt wurde?

. 
. 
. 
UILabel * site = [[UILabel alloc] initWithFrame:CGRectMake(0, 185, 320, 30)]; 
site.text = [retriever.plistDict valueForKey:@"url"]; 
site.textAlignment =UITextAlignmentCenter; 
site.backgroundColor = [UIColor clearColor]; 
site.textColor = [UIColor whiteColor]; 
site.userInteractionEnabled = YES; 
[theBgView addSubview:site]; 
[site release]; 
. 
. 
.  

Dann schreibe ich den Rückruf.

Das Problem ist gerade jetzt, egal wo ich in der Ansicht berühre, wird die URL geöffnet. Wie stelle ich fest, ob nur mein Etikett berührt wurde?

+6

Warum Sie nicht nur Ihr Etikett mit einem Knopf ersetzen? – zonble

Antwort

20

Wenn Sie das Etikett auf die Klasse hinzufügen, können Sie auf dem Touch-Ereignisse einen Hit-Test auf Ihrer Ansicht nach tun mit:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])) 
    { 
    NSURL *target = [[NSURL alloc] ...]; 
    ... 
    } 
} 

Vergessen Sie auch nicht die URL lösen Sie (sonst zuteilen du leckst).

+0

Ja, was er gesagt hat. Ausgezeichnete Antwort Kevin! – Jordan

+0

Dies diente dazu, mit Gesten mir –

1

Sie könnten auch eine unsichtbare (nicht Text oder Bild) UIButton als Unteransicht die gleiche Größe wie Ihr Etikett hinzufügen. Dies hat den zusätzlichen Vorteil, dass keine andere Arten von Berührungen erfassen, wie eine Berührung auf einem anderen Bereich des Bildschirms, die versehentlich auf das Etikett gleitet und dann hebt. Es kann auch als sauberer Code betrachtet werden.

4

Ich denke, der beste Weg für Griff für jeden UILabel Teil Flag gesetzt ist und dann die Flag-Nummer aus dem Code geben,

label.userInteractionEnabled = YES; 


-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [touches anyobject]; 

    if(touch.view.tag == uurflagnumber) 
    NSlog(@"touched"); 
} 
19

du touchesBegan ohne zwingende tun können. Verwenden Sie Gestenerkenner.

UILabel *label = ...; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *recognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)] autorelease]; 

[label addGestureRecognizer:recognizer]; 

- (void)tapAction { 
    NSLog(@"tap performed"); 
} 
+0

sorry, nicht für mich arbeiten ...(Nichts ausgelöst überhaupt) – cV2

+0

Dies kann durch eine Vielzahl von Optionen verursacht werden. Beispielsweise wird Ihre Berührung möglicherweise von einer Ebene abgebrochen, die die Beschriftung verdeckt, auf die Sie die Gestenerkennung anwenden, oder die Eigenschaft userInteractionEnabled Ihrer Ansicht wird möglicherweise zu einem bestimmten Zeitpunkt auf NEIN gesetzt, wenn Sie die Tippaktion ausführen. Fügen Sie das Label als letztes Objekt des Subviews-Arrays Ihrer Zielansicht hinzu und versuchen Sie es erneut. – Eugene

+0

vielen Dank für Ihre Antwort, userInteractionEnabled wurde auf aktiviert gesetzt, ich habe eine kleine Workaround, die der Benutzer alle erforderlichen Aktionen erfüllen konnte. Danke! – cV2

4

Eugens Lösung funktioniert, aber Sie müssen „Interaktion mit dem Benutzer aktiviert“ in Ihrer NIB-Datei aktiviert haben. Oder wie Mahyar mit dem label.userInteractionEnabled = YES hat.

Hier ist meine Lösung, da ich zwei separate Etiketten hatte, die ich berühren wollte. Und ich habe "Benutzerinteraktion aktiviert" in meiner NIB-Datei markiert.

UITapGestureRecognizer *theSpeedTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[speedLabel addGestureRecognizer:theSpeedTapped]; 

UITapGestureRecognizer *theDirectionTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[directionLabel addGestureRecognizer:theDirectionTapped]; 

Ich hoffe, das hilft.

0

Eine weitere späte Antwort ...

Wie @Kevin Sylvestre schon sagt, können Sie für den Touch über eine UILabel testen, indem -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event in Ihren View-Controller zu überschreiben.

Anstatt zu testen, ob die Berührung mit dem Rect der UILabel gefunden wird, finde ich es einfacher zu testen, ob die Berührung auf der 'Ansicht' von UILabel war (erinnere dich, UILabel erbt von UIView).

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    NSSet *touchedViews = [touches valueForKeyPath:@"view"]; 
    if ([touchedViews containsObject:self.myLabel]) { 
     // do something 
    } 
} 

Diese Technik kann leicht auf andere Interface-Objekte, die von UIView erben angewendet werden.

Außerdem ist es auch erforderlich, dass der UILabel ‚Interaktion mit dem Benutzer aktiviert‘ zu haben, um das Berührungsereignis zu reagieren. Dies kann im Interface Builder durchgeführt wird (Attribute Inspector> Ansicht> Benutzerinteraktion aktiviert) oder programmatisch - zB: self.myLabel.userInteractionEnabled = YES;

Verwandte Themen