2011-01-19 16 views

risposta

31

Uso UIGestureRecognizerDelegate:

Aggiungere UIGestureRecognizerDelegate nel file di dichiarazione (vale a dire il file .h)

Fase 1: Basta impostare il delegato di gestureRecognizer: (in un file .m viewDidLoad)

UITapGestureRecognizer *webViewTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)]; 
webViewTapped.numberOfTapsRequired = 1; 
webViewTapped.delegate = self; 
[offScreenWebView addGestureRecognizer:webViewTapped]; 
[webViewTapped release]; 

Fase 2: Override questa funzione: (in il file .m)

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

Fase 3: Ora implementare la funzione tapAction:

- (void)tapAction:(UITapGestureRecognizer *)sender 
{  
    NSLog(@"touched"); 

    // Get the specific point that was touched 
    CGPoint point = [sender locationInView:self.view]; 
} 
0

Tutto ciò che eredita da UIResponder può gestire i tocchi (così come UIWebView). Leggere il doc: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIResponder_Class/Reference/Reference.html

dovrete utilizzare:

touchesBegan:withEvent: 

Edit: Aggiunta del commento qui per clarity-

Credo allora non c'è modo pulito di farlo, puoi ignorare il metodo hittest withEvent come this o eseguire un attacco come questo: overriding UIView

+0

io sono a conoscenza di esso.Ma quando ho sottotitolato uiwebview e implementato i touchBegan e toccaEnded, non vengono chiamati affatto ..... – Satyam

+0

In tal caso, puoi creare un UIView trasparente sulla visualizzazione web e utilizzare il metodo touches su di esso. – Ankit

+0

Se metto UIView trasparente su di esso, perderà la funzionalità predefinita di webview per fare clic sui collegamenti o toccare i controlli ecc ... ho ragione? – Satyam

-1

Vuoi dire che vuoi scavalcare il opzioni che popolano quando tengono premuto su un link? Sono riuscito a ottenere uno per lavorare con questo tutorial/guida ma quello postato qui è ancora un po 'buggy e ha bisogno di fare qualche messa a punto: il metodo http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

+0

No. Ho un pulsante di chiusura sulla visualizzazione web. quando l'utente tocca la vista Web, voglio nasconderlo. quando viene toccato di nuovo, mostrerà di nuovo il pulsante di chiusura. ma non sono in grado di rilevare tocchi sulla visualizzazione web. – Satyam

+0

È possibile modificare questo tutorial per rilevare il tipo di tocco che si desidera monitorare, piuttosto che toccare e tenere premuto l'azione che sta cercando nell'esempio. –

0

Si noti che la risposta accettata sopra catturerà solo tap gesti (Touchdown e ritocco senza un trascinamento in mezzo) e quei gesti di scorrimento saranno ignorati.

Per i miei scopi, dovevo essere informato di entrambi, quindi ho aggiunto i rilevatori di gesti swipe in modo appropriato. (Si noti che pur essendo un campo di bit, non è possibile OR insieme strisciare proprietà gesto di riconoscimento direction, SO 4 di riconoscimento dei gesti sono tenuti a rilevare qualsiasi colpo).

// Note that despite being a bit field, you can't `OR` together swipe gesture 
// recognizers' `direction` property, so 4 gesture recognizers are required 
// to detect any swipe 
for (NSNumber * swipeDirection in @[@(UISwipeGestureRecognizerDirectionUp), @(UISwipeGestureRecognizerDirectionDown), @(UISwipeGestureRecognizerDirectionLeft), @(UISwipeGestureRecognizerDirectionRight)]) { 

    UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(timerReset:)]; 
    swipe.direction = [swipeDirection integerValue]; 
    swipe.delegate = self; 
    [rootWebView addGestureRecognizer:swipe]; 
} 
1

La risposta accettata è grande se avete solo bisogno di rilevare i rubinetti. Se hai bisogno di rilevare tutti i tocchi, il modo migliore è creare una nuova sottoclasse UIView e posizionarla sulla webview. Nella sottoclasse è possibile rilevare tocchi utilizzando hitTest:

TouchOverlay.h

@class TouchOverlay; 

@protocol TouchOverlayDelegate <NSObject> 

@optional 
- (void)touchOverlayTouched:(TV4TouchOverlay *)touchOverlay; 

@end 


@interface TouchOverlay : UIView 
@property (nonatomic, unsafe_unretained) id <TouchOverlayDelegate> delegate; 
@end 

Touchoverlay.m

@implementation TouchOverlay 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    return self; 
} 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *hitView = [super hitTest:point withEvent:event]; 
    if (hitView == self) { 
    if (self.delegate && [self.delegate respondsToSelector:@selector(touchOverlayTouched:)]) { 
     [self.delegate touchOverlayTouched:self]; 
    } 
    return nil;  // Tell the OS to keep looking for a responder 
    } 
    return hitView; 
} 

@end 
Problemi correlati