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
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.
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{
}
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];
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.
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.
Con guest ricognnizer, è molto facile catturare gli eventi touch.
trovare uno guested dalla libreria di componenti in storyboard:
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:
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.
e codice di azione:
@IBAction func tapAction(_ sender: Any) {
// touch is captured here.
}
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