2009-05-12 16 views
94

Ho posizionato un'immagine (UIImageView) sulla barra di navigazione. Ora voglio rilevare l'evento touch e voglio gestire l'evento. Potresti farmi sapere come posso farlo?Come posso rilevare l'evento di tocco di UIImageView

Grazie.

+0

In questa situazione vorrei (e penso che dovresti) utilizzare un UIButton personalizzato. – titaniumdecoy

+0

Verifica ** Versione Swift Risposta ** [http://stackoverflow.com/a/41328885/3177007](http://stackoverflow.com/a/41328885/3177007) –

risposta

3

È possibile ignorare il metodo touchesBegan:withEvent: della UIView (o sottoclasse) che contiene la sottoview UIImageView.

All'interno di questo metodo, verificare se uno qualsiasi dei tocchi UITouch rientra nei limiti dell'istanza UIImageView (diciamo che si chiama imageView).

Cioè, fa l'elemento CGPoint[touch locationInView] si intersecano con la CGRect elemento [imageView bounds]? Esaminare la funzione CGRectContainsPoint per eseguire questo test.

+0

Grazie per la risposta. Ho aggiunto la vista in questo modo: [navBar addSubview: self.pImage]; // aggiunto come sottoview della barra di navigazione. Ho annullato la funzione ma la funzione non viene mai chiamata. Tuttavia, ho impostato la proprietà userInteractionEnabled di UIImageView su YES. Mi sto perdendo qualcosa? – ebaccount

+0

Scopri i tocchi Began: withEvent: method. Ci sono molti esempi sui motori di ricerca di come funziona. –

113

A UIImageView è derivato da un UIView che è derivato da UIResponder quindi è pronto per gestire gli eventi di tocco. Ti consigliamo di fornire i metodi touchesBegan, touchesMoved e touchesEnded e verranno chiamati se l'utente tocca l'immagine. Se tutto ciò che si desidera è un evento di tocco, è più semplice utilizzare un pulsante personalizzato con l'immagine impostata come immagine del pulsante. Ma se vuoi un controllo più fine sui rubinetti, le mosse, ecc. Questa è la strada da percorrere.

Si potrà anche guardare un paio di cose:

  • Override canBecomeFirstResponder e tornare Sì per indicare che la vista può diventare il centro di eventi di tocco (il valore predefinito è NO).

  • Impostare la proprietà userInteractionEnabled su SÌ. L'impostazione predefinita per UIViews è SÌ, ma per UIImageViews è NO, quindi è necessario accenderlo in modo esplicito.

  • Se si desidera rispondere a eventi multi-touch (ad esempio pizzico, zoom, ecc.), È necessario impostare multipleTouchEnabled su SÌ.

+0

Ci ho provato, ma mai meno non ricevo i tocchi Eventi Began ... perché? – Markus

+5

@Markus: ho avuto lo stesso problema, ma l'ho risolto impostando 'userInteractionEnabled' su SÌ sulla mia vista genitore. Vedi http://stackoverflow.com/questions/5887305/uiview-user-interaction-enabled-false-on-parent-but-true-on-child –

135

In termini pratici, non farlo.

Aggiungi invece un pulsante con stile personalizzato (senza grafica a pulsanti se non specifichi le immagini) su UIImageView. Quindi allegare tutti i metodi che si desidera chiamare a quello.

È possibile utilizzare questa tecnica in molti casi in cui si desidera realmente che un'area dello schermo funga da pulsante anziché interagire con il materiale Touch.

+0

Ho aggiunto un pulsante nella barra di navigazione e posso anche gestire il tocco eventi. Tuttavia, voglio aggiungere un'immagine rotonda su questo pulsante. Potresti farmi sapere come posso farlo a livello di programmazione? Inoltre, potresti farmi sapere come posso impostare la proprietà del pulsante su "personalizzato" a livello di programmazione? – ebaccount

+0

Guarda i documenti per UIButton - devi impostare le immagini di sfondo per uno stato di controllo, ti serviranno immagini diverse per Normale vs. Selezionato/Evidenziato. Lo stile del pulsante è quello che hai impostato su UIButtonStyleCustom, credo - ancora una volta, guarda i documenti per la proprietà dello stile su UIButton. –

+0

Non si aggiunge un UIButton sopra UIImageView un po 'esagerato? Stai aggiungendo un oggetto extra, mentre potresti semplicemente implementare i metodi touches dell'oggetto UIImageView già esistente. No? – samvermette

6

Invece di creare un UIImageView tangibile quindi posizionarlo nella barra di navigazione, è sufficiente creare un UIBarButtonItem, che si crea da UIImageView.

Per prima cosa la visualizzazione dell'immagine:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]]; 

poi fare la voce barbutton dalla vostra vista dell'immagine:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView]; 

Poi aggiungere l'elemento pulsante della barra per la barra di navigazione:

self.navigationItem.rightBarButtonItem = yourBarButtonItem; 

Ricorda che questo codice va nel controller della vista che si trova all'interno di un controller di navigazione viewcontrolle r array. Quindi, in pratica, questa "voce pulsante della barra immagine che può essere toccata" apparirà solo nella barra di navigazione quando questo controller di visualizzazione viene visualizzato. Quando si preme un altro controller della vista, questa voce del pulsante della barra di navigazione scompare ~

23

È inoltre possibile aggiungere un UIGestureRecognizer. Esso non richiede di aggiungere un ulteriore elemento nella gerarchia vista, ma fornisce ancora si tutto il codice ben scritto per la gestione di eventi di tocco con un abbastanza semplice interfaccia:

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleSwipe:)]; 
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight; 
    [imgView_ addGestureRecognizer:swipeRight];   
    [swipeRight release]; 
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleSwipe:)]; 
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [imgView_ addGestureRecognizer:swipeLeft]; 
    [swipeLeft release]; 
+10

NON dimenticare di impostare UserInteractionEnabled per imgView_ –

+0

Questo è un approccio molto pulito. Mi ha permesso di aggiungere un gestore di tap senza modifiche al mio (già complicato) Visualizza setup e gestione. Vedi "Altro ..." in https://developer.apple.com/library/ios/documentation/UIKit/reference/UITapGestureRecognizer_Class/index.html per un gestore di scheletri semplice. – Brandyn

12

Sono stato in diversi thread su le ultime ore cercando di trovare una soluzione per il mio problema, senza risultato. Vedo che molti sviluppatori condividono questo problema e penso che le persone qui sappiano questo. Ho più immagini all'interno di un UIScrollView, cercando di ottenere gli eventi tap su di loro.

non riceve alcun evento da un UIImangeView, ma ottengo un evento da un valore simile UILable con parametri molto simili che ho impostato su di esso. sotto IOS 5.1.

ho già fatto quanto segue:

  1. set setUserInteractionEnabled a YES sia per `UIImageView e genitore vista.
  2. set setMultipleTouchEnabled su YES per UIImageView.
  3. Provato sottoclasse UIImageView, non ha aiutato nessuno.

Collegamento po 'di codice di seguito, in questo codice che inizializzare sia un UIImageView e UILabel, l'etichetta funziona bene in termini di sparare eventi. Ho provato a mantenere il codice irrilevante. Grazie ragazzi, Ilan

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)]; 
single_view.image=img; 
single_view.layer.zPosition=4; 

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)]; 
[single_view addGestureRecognizer:singleTap]; 
[single_view setMultipleTouchEnabled:YES]; 
[single_view setUserInteractionEnabled:YES]; 
[self.myScrollView addSubview:single_view];  
self.myScrollView.userInteractionEnabled=YES; 

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
testLabel.backgroundColor=[UIColor redColor]; 
[self.myScrollView addSubview:testLabel]; 
[testLabel addGestureRecognizer:singleTap]; 
[testLabel setMultipleTouchEnabled:YES]; 
[testLabel setUserInteractionEnabled:YES]; 
testLabel.layer.zPosition=4; 

e il metodo che gestisce l'evento:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture 
{ 
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil]; 
    NSLog(@"Touch event on view: %@",[tappedView class]); 
} 

Come detto, il rubinetto etichetta viene ricevuto.

-2

Aggiungi un gesto su quella immagine view.add in quella vista, quindi potrebbe rilevare il gesto sull'immagine. Potresti provare con il metodo delegato di evento touch, in quel caso potrebbe anche essere rilevato. Grazie

48

Per aggiungere un evento di tocco a un UIImageView utilizzare il seguente nella vostra .m

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)]; 

[myImageView setUserInteractionEnabled:YES]; 

[myImageView addGestureRecognizer:newTap]; 


-(void)myTapMethod{ 
    // treat image tap 
} 

speranza che aiuta.

+3

Questo è un modo estremamente semplice e pulito per rendere cliccabile una vista dell'immagine. Dovrebbe essere la risposta migliore. Grazie! – Jason

+0

felice che tu l'abbia trovato utile. felice codifica! –

+0

userInteractionEnabled = true è la parte che è facile da dimenticare, grazie. –

0

Per prima cosa è necessario posizionare un UIButton, quindi è possibile aggiungere un'immagine di sfondo per questo pulsante o è necessario posizionare UIImageView sul pulsante.

Problemi correlati