2010-03-29 14 views
14

Sto provando a determinare se un UILabel è stato toccato e in tal caso fare qualcosa. Dare ..Come posso determinare se un UILabel è stato toccato?

. 
. 
. 
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]; 
. 
. 
.  

Quindi scrivo il callback.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    retriever = [PListRetriever sharedInstance]; 
    CGPoint pt = [[touches anyObject] locationInView: self]; 
     NSURL *target = [[NSURL alloc] initWithString:[retriever.plistDict valueForKey:@"url"]]; 
     [[UIApplication sharedApplication] openURL:target]; 
    } 

Il problema è adesso, non importa da dove tocchi in Visualizza l'Url è in fase di apertura. Come posso determinare se solo la mia etichetta è stata toccata?

+6

Perché non si sostituisce semplicemente l'etichetta con un pulsante? – zonble

risposta

20

Se si aggiunge l'etichetta alla classe, si può fare una hit-test sulla vostra vista nel caso in contatto con:

- (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] ...]; 
    ... 
    } 
} 

Inoltre, non dimenticare di rilasciare l'URL di allocare (in caso contrario stai perdendo).

+0

Sì, quello che ha detto. Ottima risposta Kevin! – Jordan

+0

Questo mi è servito con gesti –

1

Si potrebbe anche aggiungere un invisibile (non testo o immagine) UIButton come sottoview delle stesse dimensioni dell'etichetta. Questo ha l'ulteriore vantaggio di non catturare altri tipi di tocchi, come un tocco su un'altra area dello schermo che scivola accidentalmente sull'etichetta e quindi si solleva. Può anche essere considerato un codice più pulito.

4

Penso che il modo migliore per la maniglia è quella di impostare il flag per ogni parte UILabel e poi dare il numero di bandiera dal codice,

label.userInteractionEnabled = YES; 


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

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

Si può fare questo senza sostituire touchesBegan. Utilizza i riconoscitori di gesti.

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

[label addGestureRecognizer:recognizer]; 

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

scusa, non ha funzionato per me ...(nulla attivato) – cV2

+0

Questo potrebbe essere causato da una varietà di opzioni. Ad esempio il tuo tocco potrebbe essere cancellato da un livello che oscura l'etichetta su cui stai impostando il riconoscimento dei gesti oppure la proprietà userInteractionEnabled della tua vista potrebbe essere impostata su NO in un determinato momento quando stai eseguendo l'azione di tocco. Aggiungi l'etichetta come ultimo oggetto dell'array di visualizzazioni secondarie della tua vista target e riprova. – Eugene

+0

grazie mille per la tua risposta, userInteractionEnabled era impostato su abilitato, ho fatto una piccola soluzione che ha permesso all'utente di compiere tutte le azioni necessarie. grazie! – cV2

4

La soluzione di Eugene funziona ma è necessario che "interazione utente abilitata" sia selezionata nel file NIB. O come ha Mahyar con label.userInteractionEnabled = YES.

Ecco la mia soluzione perché avevo due etichette separate da cui desideravo catturare i tocchi. E ho "interazione utente abilitata" spuntato nel mio file di pennino.

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

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

Spero che questo aiuti.

0

Un'altra risposta in ritardo ...

Come @Kevin Sylvestre suggerisce, è possibile verificare per il tocco su un UILabel sovrascrivendo -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event nel vostro controller della vista.

Tuttavia, piuttosto che testare se il tocco si trova con il rect di UILabel, trovo più semplice testare se il tocco fosse sulla "vista" di UILabel (ricorda UILabel eredita da 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 
    } 
} 

Questa tecnica può essere facilmente applicata ad altri oggetti di interfaccia che ereditano da UIView.

Inoltre, è anche necessario che UILabel abbia "interazione utente abilitata" per rispondere all'evento di tocco. Questo può essere fatto in Interface Builder (Impostazioni Attributi> Visualizza> Interazione Utente Abilitata) o programmaticamente - ad esempio: self.myLabel.userInteractionEnabled = YES;

Problemi correlati