En UIWebview, ¿cómo puedo detectar un toque?Cómo detectar el tacto en UIWebView
Pero no cuando el usuario hace clic en alguna URL o toca un control.
¿Es posible manejarlo?
En UIWebview, ¿cómo puedo detectar un toque?Cómo detectar el tacto en UIWebView
Pero no cuando el usuario hace clic en alguna URL o toca un control.
¿Es posible manejarlo?
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];
}
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
¿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/
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
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. –
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];
}
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
yo soy consciente de ello.Pero cuando clasifiqué uiwebview e implementé touchesBegan y touchesEnded, no se llaman en absoluto ... – Satyam
En ese caso, puede crear una UIView transparente sobre la vista web y usar el método de toques en ella. – Ankit
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