2012-11-16 14 views
5

Desidero ottenere quanto segue.Creazione di un UIView che acquisisce i tocchi, ma è trasparente per tutti gli altri gesti

Scenario: la tastiera iOS è a schermo mentre l'utente sta digitando un particolare campo di testo. L'utente può toccare qualsiasi punto al di fuori della tastiera e del campo di testo per chiudere la tastiera (senza attivare alcun pulsante visibile). Inoltre, l'utente può trascinare fuori dalla tastiera e osservare il normale comportamento di trascinamento su alcune disposizioni delle viste scorrevoli.

Concettualmente, sto mettendo una “copertura” UIView su gran parte dello schermo, che si comporta in modo tale che:

  1. Se l'utente tocca in copertina, poi ho catturare quel rubinetto (in modo che possa Ad esempio, ignorare la tastiera). È facile ottenerlo intercettando gli eventi di tocco in una sottoclasse UIView o utilizzando un riconoscitore di gesti.

  2. Se l'utente trascina sul coperchio, quindi il coperchio ignora o avanti questi tocchi; questi sono ricevuti dagli strati sottostanti proprio come sarebbero stati senza una copertura.

Quindi: l'utente deve essere in grado di scorrere il contenuto sotto il coperchio, ma non toccare il contenuto sotto il coperchio. Un tocco "esterno" della tastiera e del campo di testo dovrebbe eliminare la tastiera (e la copertina), ma non dovrebbe attivare nulla.

Come posso ottenere questo risultato?

+0

È necessario prendere in considerazione l'implementazione del metodo delegati touch e passare i tocchi alle viste che si trovano dietro di esso per lo scorrimento. '- (void) touchesBegan: (NSSet *) tocca conEvent: (UIEvent *) evento { [otherView touchesBegan: touch withEvent: event]; } 'Un altro modo è implementare, UIPanGestureRecognizer e impostare cancelsTouchesInView = YES come' UIPanGestureRecognizer * gr = [[UIPanGestureRecognizer alloc] initWithTarget: self action: @selector (handlePan)]; [gr setCancelsTouchesInView: YES]; [myButton addGestureRecognizer: gr]; [gr release]; ' – iDev

+1

@mjh, hai mai trovato una soluzione a questo? – kpozin

risposta

0

1: Aggiungere un riconoscitore rubinetto gesto alla vista:

//Adding tap gesture 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; 
    tapGesture.numberOfTapsRequired = 1; 
    [self.view addGestureRecognizer:tapGesture]; 

2: In handleTapGesture si resignFirstResponder della tastiera

- (void)handleTapGesture:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateRecognized) { 
     //Resign first responder for keyboard here 
    } 
} 

elaborato un po 'sul risposta di cui sopra. UIGestureRecognizerStateRecognized si assicura che siano riconosciuti gli eventi a scheda singola.

E 'questa la funzionalità che cercavi?

+0

La sua domanda è "se l'utente trascina sulla copertina, quindi la copertina ignora tutti i tocchi, che sono ricevuti dagli strati sottostanti proprio come sarebbero stati senza una copertura". Ha già capito come rilevare il tocco. – iDev

+0

Se 'UIView' è in grado di riconoscere i tocchi, il suo' .userInteractionEnabled' deve essere 'YES' e quindi mangia tutti gli eventi di tocco, impedendo che le trascinazioni vengano riconosciute da ciò che si trova al di sotto. – mjh

2

Aggiungere il gesto rubinetto solito modo:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; 
[self.view addGestureRecognizer:tapGesture]; 

Ma che cosa si può essere cercando è questo:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    {  
     return YES; 
    } 

documentazione afferma: Il metodo viene chiamato quando il riconoscimento di un gesto da entrambe gestureRecognizer o otherGestureRecognizer bloccherebbe l'altro riconoscimento di gesture dal riconoscere il suo gesto. (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate)

In questo modo, si può essere certi che sia totalmente trasparente e che nulla impedirà di chiamare il riconoscimento.

0

una visualizzazione personalizzata che inoltra tutti i tocchi che riceve:

class CustomView: UIView { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 

     var hitView = super.hitTest(point, withEvent: event) 

     if hitView == self { 
      return nil 
     } 

     return hitView 
    }  
} 

Da lì si può andare modi diversi per fare solo uso di gesti tap. Osservare l'UIEvent per i suoi tocchi o utilizzare un riconoscitore di gesti.

Problemi correlati