tutorial open example iphone uiwebview

iphone - open - uiwebview tutorial



Manejo de toques dentro de UIWebview (10)

He creado una subclase de UIWebView y he implementado los touchesBegan , touchesMoved y touchesEnded .

pero la subclase webview no maneja los eventos touch .

¿Hay algún método para manejar los eventos táctiles dentro de la subclase UIWebView ?


¿Quiere decir que su implementación subclase no se llama cuando se llaman touchesBegan, touchesMoved y touchesEnded?

Suena como un problema con la forma en que ha creado una instancia del objeto. Se requieren más detalles, creo.

(tomado de los comentarios)

Archivo de cabecera

#import <UIKit/UIKit.h> @interface MyWebView : UIWebView { } @end

Archivo de Implementación

#import "MyWebView.h" @implementation MyWebView - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { } return self; } - (void)drawRect:(CGRect)rect { NSLog(@"MyWebView is loaded"); } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touches began"); } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Touches ended"); } - (void)dealloc { [super dealloc]; } @end


Acabo de descubrir que UIWebView comprueba si responde al selector - (void)webViewDidNotClick: (id)webBrowserView , una vez que toca en el área de visualización (no en hyperref o en cualquier otra área que deba manejarse específicamente). Entonces puedes implementar ese selector con tu código de manejo :)


Gestionar gestos en un UIWebView se trata en este hilo del foro de desarrolladores de Apple .

Usando la información dada allí, no habrá necesidad de una vista adicional en la mayoría o en todos los casos, y como se mencionó anteriormente, anular UIWebView no es el camino a seguir.

Copia de la publicación más importante del hilo:

Este es un problema conocido. UIWebView tiene su propio UITapGestureRecognizers, y están en una subvista privada de UIWebView. La precedencia de UIGestureRecognizer define que los gestos asociados a vistas más profundas en la jerarquía de vistas excluirán los que están en superviews, por lo que los gestos de tap de la vista web siempre prevalecerán sobre los tuyos.

Si está bien en su caso permitir que su toque ocurra junto con el toque normal de la vista web, su mejor solución sería implementar el método UIGestureRecognizerDelegate gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer y devolver YES para otros gestos de toque. De esta forma, se llamará a su controlador de acceso y la vista web seguirá recibiendo su llamada.

Si necesita ser el único que maneje el grifo, tendrá que subclasificar UITapGestureRecognizer para que pueda usar las anulaciones de un sentido en UIGestureRecognizerSubclass.h, y luego puede devolver NO desde canBePreventedByGestureRecognizer: cuando se le pregunte si el reconocedor de gestos de toque de la vista web puede prevenir el tuyo

En cualquier caso, sabemos sobre esto y esperamos facilitarlo en el futuro.


Intentaría invalidar -sendEvent: en UIWindow, para ver si puede interceptar esos eventos táctiles.


No es necesario UITapGestureRecognizer subclases, simplemente agregue un UITapGestureRecognizer :

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapMethod)]; [tap setNumberOfTapsRequired:1]; // Set your own number here [tap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol [self.myWebView addGestureRecognizer:tap];

Agregue el protocolo <UIGestureRecognizerDelegate> en el archivo de encabezado y agregue este método:

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


No estoy seguro de si esto es lo que quieres (no es lo que pediste, pero podría funcionar dependiendo de cuál sea tu juego final), pero podrías interpretar los toques en JavaScript desde dentro de UIWebView y obtener javascript para hacer

document.location=''http://null/''+xCoord+''/''+yCoord; // Null is arbitrary.

Entonces puedes ver eso usando el método delegado de UIWebView

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

Y si request.URL.host (o lo que sea) isEqualToString: @ "null" toma la acción relevante (y devuelve NO en lugar de YES). Incluso puede agregar el JS a cada página haciendo algo como:

- (void)webViewDidFinishLoad:(UIWebView *)webView { [webView stringByEvaluatingJavaScriptFromString:@"window.ontouchstart=function(/* ... */);"]; }

¿Espero que esto ayude?


Podrías poner un UIView sobre tu UIWebView y sobrepasar el touchesDidBegin , etc., y luego enviarlos a tu vista web. Ex:

El usuario toca tu UIView , lo que provoca un

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // Execute your code then send a touchesBegan to your webview like so: [webView touchesBegan:touches withEvent:event]; return; }

su UIView tiene que estar sobre la vista web.


Si quiere detectar sus propios grifos pero deshabilita los grifos de UIWebView, puede usar mi solución:

-(void)recursivelyDisableTapsOnView:(UIView*)v{ for(UIView* view in v.subviews){ for(UIGestureRecognizer* g in view.gestureRecognizers){ if(g == self.ownTapRecognizer){ continue; } if([g isKindOfClass:[UITapGestureRecognizer class]] || [g isKindOfClass:[UILongPressGestureRecognizer class]] || [g isKindOfClass:NSClassFromString(@"UITapAndAHalfRecognizer")]){ g.enabled = NO; } } [self recursivelyDisableTapsOnView:view]; } } - (void)webViewDidFinishLoad:(UIWebView *)webView{ [self recursivelyDisableTapsOnView:webView]; //disable selection [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect=''none'';"]; // Disable callout [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout=''none'';"]; }


Si todo lo que necesita es manejar los gestos, dejando intacto el resto de la funcionalidad de UIWebView, puede subclase UIWebView y usar esta estrategia:

en el método init de su subclase UIWebView, agregue un reconocedor de gestos, por ejemplo:

UISwipeGestureRecognizer * swipeRight = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGestureRightMethod)]; swipeRight.direction = UISwipeGestureRecognizerDirectionRight; [self addGestureRecognizer:swipeRight]; swipeRight.delegate = self;

luego, agrega este método a tu clase:

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

Agregue y maneje su selector designado a la clase, en este caso "handleSwipeGestureRightMethod" y está listo para ir ...


Siguiendo con lo que dijo Unfalkster, puedes usar el método hitTest para lograr lo que quieres, pero no tienes que subclase UIWindow. Solo ponga esto en su subclase de vista web. Obtendrá una advertencia de tiempo de compilación, pero funciona:

- (void)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if (event.type == UIEventTypeTouches) { // get location info CGFloat x = point.x; CGFloat y = point.y; // get touches NSSet *touches = [event allTouches]; // individual touches for (UITouch *touch in touches) { if (touch.phase == UITouchPhaseBegan) { // touches began } else if (touch.phase == UITouchPhaseMoved) { } // etc etc } } // call the super [super hitTest:point withEvent:event]; }

¡Espero que ayude!