Sto visualizzando un documento in una UIWebView. Voglio posizionare un hotspot sul documento per attivare un'azione quando viene toccato, ma voglio anche mantenere il comportamento di UIWebView predefinito dello zoom automatico del documento quando viene toccato due volte. Non riesco a capire come rispondere ai single-tap mentre permetto a UIWebView di rispondere ai doppi tocchi.Come rispondere solo a un gesto a tocco singolo mentre si lascia che gli oggetti alle spalle rispondano ai doppi tocchi?
Prima ho impostato l'hotspot come un UIButton trasparente con un'azione, ma toccando due volte l'hotspot, l'azione dell'hotspot veniva richiamata due volte. Così ho tolto l'azione dal bottone e attaccato un gesto single-tap, invece:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
questo funziona lo stesso del normale azione del pulsante. Ma poi ho creato un gesto doppio tocco, e configurato per bloccare il gesto single-tap con requireGestureRecognizerToFail:
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(zoomWebView:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delegate = self;
[self.hotspot addGestureRecognizer:doubleTap];
[doubleTap release];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
[singleTap requireGestureRecognizerToFail:doubleTap];
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
- (void)zoomWebView:(UITapGestureRecognizer *)gesture {
NSLog(@"double tap");
}
Con questa impostazione, un single-tap sul hotspot chiama singleTapAction e un doppio-tap sulla hotspot chiama zoomWebView (un metodo personalizzato). Ciò è positivo perché singleTapAction non viene più chiamato due volte, ma è negativo perché UIWebView non risponde più al doppio tocco.
Ho tentato di inoltrare l'evento di doppio tocco dal mio gesto doubleTap a UIWebView sottoclassando UITapGestureRecognizer, ignorando i touchBegan e toccando i metodi Ended e inviando i loro argomenti ai metodi corrispondenti di UIWebView. Quando l'ho fatto, ho potuto vedere che la mia sottoclasse stava ricevendo gli eventi, ma UIWebView non ha risposto agli eventi inoltrati. Questo è prevedibile perché il Event Handling Guide for iOS dice che possiamo solo inoltrare eventi a sottoclassi personalizzate di UIView, non a oggetti framework UIKit.
C'è un modo per impedire al mio gesto di tocco singolo di rispondere a due volte che non devia gli eventi di doppio tocco? Questo sembra un requisito di base, ma non riesco a vedere un modo semplice per farlo. Ho letto e sperimentato con UIGestureRecognizer's touch delivery properties, ma nessuna combinazione di valori ha impedito al gesto a tocco singolo di consumare il gesto del doppio tocco.
A proposito, la relazione tra l'hotspot e UIWebView nella mia gerarchia di vista è quella di "cugini" - sono sottoview di due visualizzazioni di pari livello. Se aggiungo il riconoscimento dei gesti alla vista hotspot, la vista Web o la loro vista "nonno", ottengo gli stessi risultati.
non sono sicuro di questo (e quindi essendo un commento), ma non si può aggiungere un solo gesto rubinetto per l'UIWebView? –
@DeanPucsek Lo stavo facendo da un po 'e ha funzionato durante la visualizzazione di documenti PDF. Ma se il contenuto mostrato in UIWebView è HTML o JPG, UIWebView acquisisce il single-tap per le proprie azioni e UIGestureRecognizer non riceve l'evento. Sarebbe più comodo gestirlo con una visualizzazione hotspot, ma potrei tornare a questo approccio se potessi farlo funzionare con tutti i tipi di contenuto di UIWebView. – arlomedia