2010-11-09 19 views
30

Qualcuno ha un codice di esempio per rilevare tocchi su un UIView creato dinamicamente? Ho trovato alcuni riferimenti a touchesBegan ma non riesco a capire come implementarlo ...Tocca evento su UIView

risposta

80

un modo molto generale per arrivare tocchi è quello di ignorare questi metodi in una sottoclasse UIView personalizzato:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 

la documentazione ufficiale per questi metodi è sotto Rispondendo a toccare Ev ents in the UIResponder class docs (UIView eredita questi metodi poiché è una sottoclasse di UIResponder). Documenti più lunghi e più introduttivi possono essere trovati nel Event Handling Guide for iOS.

Se si desidera rilevare un tocco (touchdown, quindi ritocco all'interno della visualizzazione), è più semplice aggiungere uno UIButton come visualizzazione secondaria della vista e aggiungere il proprio metodo personalizzato come target/azione coppia per quel pulsante. I pulsanti personalizzati sono invisibili per impostazione predefinita, pertanto non influiscono sull'aspetto della visualizzazione.

Se stai cercando interazioni più avanzate, è anche utile sapere su the UIGestureRecognizer class.

4

Crea il tuo personalizzato UIView da una sottoclasse creato ereditando UIView e sovrascrivere il metodo seguente all'interno della sottoclasse,

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

} 
16

Crea un evento touch con UIAnimation su UIView, puoi gestire i tocchi su UIView ovunque.

Codice seguente: qui self.finalScore è un UIView e cup è un UIImageView. Gestisco

l'evento di tocco su UIImageView, presente all'interno di UIView.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch1 = [touches anyObject]; 
CGPoint touchLocation = [touch1 locationInView:self.finalScore]; 
CGRect startRect = [[[cup layer] presentationLayer] frame]; 
CGRectContainsPoint(startRect, touchLocation); 

[UIView animateWithDuration:0.7 
         delay:0.0 
        options:UIViewAnimationCurveEaseOut 
       animations:^{cup.transform = CGAffineTransformMakeScale(1.25, 0.75);} 
       completion:^(BOOL finished) { 
        [UIView animateWithDuration:2.0 
              delay:2.0 
             options:0 
             animations:^{cup.alpha = 0.0;} 
             completion:^(BOOL finished) { 
              [cup removeFromSuperview]; 
              cup = nil;}];     
       }]; 

} 

Come UITapGestureRecognizer è un altro modo di gestire gli eventi touch su UIView ....

UITapGestureRecognizer *touchOnView = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(releaseButAction)] autorelease]; 

// Set required taps and number of touches 
[touchOnView setNumberOfTapsRequired:1]; 
[touchOnView setNumberOfTouchesRequired:1]; 

// Add the gesture to the view 
[[self view] addGestureRecognizer:touchOnView]; 
+0

il secondo codice snipped mi ha aiutato, ma meglio la pratica sarebbe 'UITapGestureRecognizer * touchOnView = [[[UITapGestureRecognizer alloc] initWithTarget: azione di auto: @selector (releaseButAction :)] autorelease]; 'e il metodo sarebbe quindi' - (void) releaseButAction: (UIGestureRecognizer *) gestureRecognizer' .. solo fyi! – sixstatesaway

1

Invece di catturare tocco usando gesto, vorrei suggerire di cambiare UIView classe genitore per UIControl, in modo che si può gestire l'evento touchUpInside

Da:

@interface MyView : UIView 

A:

@interface MyView : UIControl 

e quindi aggiungere questa linea per vista-

[self addTarget:self action:@selector(viewTapped:) forControlEvents:UIControlEventTouchUpInside]; 

perché il gesto può creare problemi durante lo scorrimento.

2

Il mio metodo è semplicemente cambiare la classe UIView in UIControl in IdentBuilder IdentityInspector, quindi ConnectionsInspector avrà immediatamente l'evento tattile pronto per l'hook.

modifiche del codice zero.

3

Con guest ricognnizer, è molto facile catturare gli eventi touch.

trovare uno guested dalla libreria di componenti in storyboard:

enter image description here

Ad esempio, trascinare Tap Gesture Recognizer alla vista. Non è mostrato nell'interfaccia utente della vista. Potete trovare da contorno documento nel pannello di sinistra in Storyboard:

enter image description here

Il passo finale è quello di collegarlo (tramite controllo-trascinamento) per la vista come delegato in cui viene monitorata tocco, e il controllo trascinare alla tua classe di controller di visualizzazione come un'azione. Ecco l'immagine delle connessioni di collegamento.

enter image description here

e codice di azione:

@IBAction func tapAction(_ sender: Any) { 
    // touch is captured here. 
}