36 votes

Manipulation des touches dans UIWebview

J'ai créé une sous-classe de UIWebView et ont mis en œuvre le touchesBegan , touchesMoved et touchesEnded méthodes.

mais la sous-classe webview ne gère pas l'option touch événements.

Existe-t-il une méthode permettant de gérer les événements tactiles à l'intérieur de l'interface utilisateur ? UIWebView sous-classe ? ??

46voto

John Points 281

J'ai un UIWebView comme enfant de la vue de UIViewController. La solution qui a fonctionné pour moi (pour le geste de tabulation) est la suivante :

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onDoubleTap:)];
tap.numberOfTapsRequired = 2;
tap.delegate = self;

[self.webView addGestureRecognizer:tap];

Mon UIViewController met en œuvre la méthode suivante du protocole UIGestureRecognizerDelegate (je répète simplement YES) :

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

C'est tout, aucune sous-classe n'est nécessaire.

16voto

Mithin Points 494

La documentation indique clairement que UIWebView n'est pas destiné au sous-classement. Cependant, vous pouvez toujours détecter tous les événements. Ce site Le tutoriel devrait vous aider.

9voto

ecume des jours Points 613

Si tout ce dont vous avez besoin est de gérer les gestes, tout en laissant le reste de la fonctionnalité UIWebView intacte, vous pouvez sous-classer UIWebView et utiliser cette stratégie :

dans la méthode init de votre sous-classe UIWebView, ajoutez un reconnaissant de gestes, par exemple :

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

puis, ajoutez cette méthode à votre classe :

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

Ajoutez et manipulez votre sélecteur désigné à la classe, dans ce cas "handleSwipeGestureRightMethod" et vous êtes prêt à partir...

7voto

Alexandre Cassagne Points 1024

Vous pourriez mettre un NSView sur votre UIWebView et de remplacer le touchesDidBegin etc, puis les envoyer à votre webview. Ex :

L'utilisateur touche votre NSView ce qui provoque une

- (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;
}

votre NSView doit être au-dessus de la vue web.

5voto

Benjie Points 3416

Je ne suis pas sûr que ce soit ce que vous voulez (ce n'est pas ce que vous avez demandé, mais cela pourrait fonctionner en fonction de votre objectif final), mais vous pourriez plutôt interpréter les touches en JavaScript à l'intérieur de l'UIWebView, et faire en sorte que javascript fasse

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

Vous pouvez alors l'attraper en utilisant la méthode de délégation de l'UIWebView.

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

Et si la requête.URL.host (ou quoi que ce soit) estEqualToString:@"null", prenez l'action appropriée (et renvoyez NO au lieu de YES). Vous pouvez même ajouter le JS à chaque page en faisant quelque chose comme :

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

J'espère que cela vous aidera ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X