come posso rilevare l'evento tocco di un UIImageView


97

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

Grazie.


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

Controlla la versione di Swift Risposta http://stackoverflow.com/a/41328885/3177007
Mohamed Jaleel Nazir

Risposte:


137

In termini pratici, non farlo.

Aggiungere invece un pulsante con uno stile personalizzato (nessuna grafica del pulsante a meno che non si specifichino immagini) su UIImageView. Quindi collega tutti i metodi che vuoi chiamare a quello.

Puoi usare questa tecnica per molti casi in cui vuoi davvero che alcune aree dello schermo agiscano come un pulsante invece di scherzare con le cose Touch.


Ho aggiunto un pulsante nella barra di navigazione e posso anche gestire eventi di tocco. 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

Guarda i documenti per UIButton: devi impostare le immagini di sfondo per uno stato di controllo, vorrai immagini diverse per Normale e Selezionato / Evidenziato. Lo stile del pulsante è quello che imposti su UIButtonStyleCustom, credo - di nuovo, guarda i documenti per la proprietà dello stile su UIButton.
Kendall Helmstetter Gelner

1
L'aggiunta di un pulsante UIB in cima a UIImageView non è un po 'esagerata? Stai aggiungendo un oggetto in più, mentre potresti semplicemente implementare i metodi touches dell'oggetto UIImageView già esistente. No?
samvermette

32
Se guardi la dimensione di un pulsante UIB in memoria, non è praticamente nulla e ne hai solo pochi per schermo. Quello che ottieni gratuitamente è l'intero cablaggio dell'azione di destinazione per diversi stati (come il ritocco all'interno) e anche un bel comportamento come non attivare quando premi verso il basso ma fai scorrere un dito di lato. Fondamentalmente i pulsanti sono uno degli oggetti più finemente realizzati nell'intero sistema e pensare che farai un codice tattile personalizzato che funzioni meglio è una follia. Usa ciò che è economico e funziona bene, salva il lavoro personalizzato per cose che i framework non gestiscono già per te.
Kendall Helmstetter Gelner

6
Puoi anche sovrapporre un UIControl se tutto ciò di cui hai bisogno sono eventi touch (tramite addTaget: action: forControlEvents :). È un po 'più economico di un pulsante UIB che ha immagini e diversi stati. Inoltre, utilizzo le condizioni del preprocessore per cambiare il colore di sfondo del controllo sovrapposto in rosa in modo da poter vedere esattamente dove si trovano (e ricordare che esistono :-).
Jeff

115

A UIImageViewè derivato da a da UIViewcui è derivato, UIResponderquindi è pronto per gestire gli eventi di tocco. Ti consigliamo di fornire touchesBegan, touchesMovedetouchesEnded metodi e vengano richiamate se l'utente tocca l'immagine. Se tutto ciò che desideri è un evento tocco, è più semplice utilizzare un pulsante personalizzato con l'immagine impostata come immagine del pulsante. Ma se vuoi un controllo più preciso su rubinetti, movimenti, ecc., Questa è la strada da percorrere.

Ti consigliamo anche di esaminare alcune altre cose:

  • Sostituisci canBecomeFirstRespondere restituisci YES per indicare che la vista può diventare il fulcro degli eventi di tocco (l'impostazione predefinita è NO).

  • Imposta la userInteractionEnabledproprietà su YES. L'impostazione predefinita per UIViewsè SÌ, ma per UIImageViewsNO, quindi è necessario attivarlo esplicitamente.

  • Se vuoi rispondere a eventi multi-touch (ad es. Pizzicare, zoomare, ecc.), Ti consigliamo di impostare multipleTouchEnabledsu SÌ.


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

5
@Markus: ho avuto lo stesso problema, ma l'ho risolto impostando userInteractionEnabledSÌ nella vista genitore. Vedi stackoverflow.com/questions/5887305/…
Saxon Druce

51

Per aggiungere un evento tocco a un UIImageView, utilizza quanto segue nel tuo .m

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

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


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

spero che aiuti.


userInteractionEnabled = true è la parte che è facile dimenticare, grazie.
Michael Peterson

23

Puoi anche aggiungere un UIGestureRecognizer. Non richiede l'aggiunta di un elemento aggiuntivo nella gerarchia di visualizzazione, ma fornisce comunque tutto il codice ben scritto per la gestione degli eventi di tocco con un'interfaccia abbastanza semplice:

    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_
Anonymous White

13

Sono stato su diversi thread nelle ultime ore cercando di trovare una soluzione per il mio problema, senza alcun risultato. Vedo che molti sviluppatori condividono questo problema e penso che le persone qui lo sappiano. Ho più immagini all'interno di un fileUIScrollView , cercando di ottenere eventi di tocco su di esse.

non UIImangeViewricevo alcun evento da un , ma ottengo un evento da un simile UILablecon parametri molto simili che sto impostando. sotto IOS 5.1.

Ho già fatto quanto segue:

  1. impostare setUserInteractionEnabled su YES sia per `UIImageView che per la vista padre.
  2. impostare setMultipleTouchEnabled su YES per UIImageView.
  3. Ho provato la sottoclasse UIImageView, ma non ha aiutato nessuno.

Allegando del codice di seguito, in questo codice inizializzo sia a UIImageViewche UILabel, l'etichetta funziona bene in termini di eventi di accensione. Ho provato a tenere fuori 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 tocco dell'etichetta viene ricevuto.


6

Invece di creare un UIImageView toccabile e quindi posizionarlo sulla barra di navigazione, dovresti semplicemente creare un UIBarButtonItem, che fai da un UIImageView.

Per prima cosa crea la visualizzazione dell'immagine:

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

Quindi crea l'elemento Barbutton fuori dalla visualizzazione dell'immagine:

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

Quindi aggiungi l'elemento del pulsante della barra alla barra di navigazione:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

Ricorda che questo codice va nel controller di visualizzazione che si trova all'interno di un array di controller di visualizzazione del controller di navigazione. Quindi, fondamentalmente, questo "elemento pulsante della barra dall'aspetto immagine toccabile" apparirà solo nella barra di navigazione quando viene mostrato questo controller di visualizzazione. Quando si preme un altro controller di visualizzazione, l'elemento del pulsante della barra di navigazione scompare ~


3

Quello che potresti voler fare è sovrascrivere il touchesBegan:withEvent:metodo della UIView(o sottoclasse) che contiene il tuoUIImageView sottoview.

All'interno di questo metodo, verifica se qualcuno dei UITouchtocchi rientra nei limiti delUIImageView dell'istanza (diciamo che è chiamato imageView).

Cioè, l' CGPointelemento si [touch locationInView]interseca con l' CGRectelemento [imageView bounds]? Guarda nella funzione CGRectContainsPointper eseguire questo test.


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

Dai un'occhiata al metodo touchesBegan: withEvent:. Ci sono molti esempi sui motori di ricerca di come funziona.
Alex Reynolds,

1

Per prima cosa dovresti posizionare un pulsante UIB, quindi puoi aggiungere un'immagine di sfondo per questo pulsante o devi posizionare un UIImageView sul pulsante.

o

È possibile aggiungere il gesto del tocco a un UIImageView in modo da ottenere l'azione del clic quando si tocca UIImageView.


0

Per quelli di voi che cercano una soluzione Swift 4 a questa risposta. È possibile utilizzare quanto segue per rilevare un evento di tocco su un UIImageView.

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

Dovrai quindi definire il tuo selettore come segue:

@objc func imageViewTapped() {
    // Image has been tapped
}

-2

Aggiungi il gesto su quella vista.aggiungi l'immagine in quella vista, quindi rileverà anche il gesto sull'immagine. Potresti provare con il metodo delegato dell'evento tocco, quindi anche in quel caso potrebbe essere rilevato. Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.