2011-01-19 10 views

Respuesta

31

Uso UIGestureRecognizerDelegate:

Añadir UIGestureRecognizerDelegate en el expediente de declaración (es decir, su archivo .h)

Paso 1: Sólo tienes que configurar el delegado de gestureRecognizer: (en el archivo .m viewDidLoad)

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

Paso 2: anular esta función: (en archivo .m)

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

Paso 3: Ahora implementar la función característica TapAction:

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

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

Todo lo que hereda de UIResponder puede manejar toques (también lo hace UIWebView). Leer el documento: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIResponder_Class/Reference/Reference.html

que tendrá que utilizar:

touchesBegan:withEvent: 

Editar: Agregar el comentario aquí para claridad-

Creo entonces no hay manera limpia de hacerlo, puede anular el método de hittestEvent como this o hacer un truco como este: overriding UIView

+0

yo soy consciente de ello.Pero cuando clasifiqué uiwebview e implementé touchesBegan y touchesEnded, no se llaman en absoluto ... – Satyam

+0

En ese caso, puede crear una UIView transparente sobre la vista web y usar el método de toques en ella. – Ankit

+0

Si coloco UIView transparente sobre él, perderá la funcionalidad predeterminada de vista web para hacer clic en enlaces o tocar los controles, etc. ¿estoy en lo cierto? – Satyam

-1

¿Quiere decir que quiere anular el opciones que aparecen cuando mantienen presionado un enlace? Me las arreglé para conseguir uno para trabajar con este tutorial/guía, pero la publicada aquí es todavía un poco buggy y necesidades que usted pueda hacer algunos ajustes: Método http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

+0

No. Tengo un botón de cerrar en la vista web. cuando el usuario toca la vista web, quiero ocultarla. cuando se toca de nuevo, se volverá a mostrar el botón de cerrar. pero no puedo detectar toques en la vista web. – Satyam

+0

Puede modificar ese tutorial para detectar el tipo de toque que desea controlar, en lugar de la acción de tocar y mantener que está buscando en el ejemplo. –

0

Tenga en cuenta que la respuesta aceptada anterior sólo capturará grifo gestos (toma de contacto y retoque sin un lastre en el medio) , y que los gestos de deslizamiento serán ignorados.

Para mis propósitos, necesitaba ser informado de ambos, así que agregué reconocimientos de gestos de deslizamiento de manera apropiada. (Tenga en cuenta que a pesar de ser un campo de bit, no puede OR rotar la propiedad direction de los reconocedores de gestos, por lo que se requieren 4 reconocedores de gestos para detectar cualquier deslizamiento).

// 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 respuesta aceptada es excelente si solo necesita detectar las derivaciones. Si necesita detectar todos los toques, la mejor manera es crear una nueva subclase UIView y colocarla sobre la vista web. En la subclase se puede detectar mediante toques 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 
Cuestiones relacionadas