Ich habe eine UIWebView
mit einer Navigationsleiste und Symbolleiste, die ich automatisch ausblenden möchte. Ich mache das schon, aber ich möchte sie zeigen, wenn der Benutzer auf UIWebView
klickt.
Mein Problem ist, dass UIWebView
alle Berührungen erfasst, und ich kann die, die ich brauche, nicht abfangen.
Gibt es eine Problemumgehung dafür?
Die meisten Ansätze behandeln ein kompliziertes Paar von UIView
und UIWebView
Unterklassen und übersteuern -touchesBegan:withEvent:
etc. Methoden.
Dieser JavaScript-basierte Ansatz fängt das Web-DOM selbst ab. und es scheint eine clevere Möglichkeit zu sein, den komplexeren Prozess zu umgehen. Ich habe es selbst nicht ausprobiert, aber ich bin neugierig auf die Ergebnisse, wenn Sie es versuchen.
Entnommen aus einem Blogeintrag (lädt nicht, aber zum Glück ist es Google Cache" ) von Mithin Kumar
(Mithin, ich hoffe, es macht Ihnen nichts aus, wenn ich es hier veröffentliche; wenn Sie das tun, lassen Sie es mich bitte in den Kommentaren wissen und ich werde es entfernen.)
Kürzlich habe ich an einem Projekt gearbeitet, das die Erkennung von Tap und Events im UIWebView erfordert. Wir wollten herausfinden, auf welches HTML-Element der Benutzer in der UIWebView tippt und dann abhängig von dem geklopften Element eine Aktion ausführen sollte. Nach einigem Googeln fand ich heraus, dass die meisten Benutzer eine transparente UIView auf das UIWebView legen, die Touch-Methoden der UIResponder-Klasse neu implementieren (zB: -touchesBegan: withEvent :) und dann die Ereignisse an die UIWebView übergeben. Diese Methode wird im Detail erklärt hier . Es gibt mehrere Probleme mit der Methode.
- Kopieren / Auswahl funktioniert nicht mehr in UIWebView
- Wir müssen eine Unterklasse von UIWebView erstellen, während Apple sagt, wir sollten es nicht unterklassen.
- Viele andere UIWebView-Funktionen funktionieren nicht mehr.
Wir haben schließlich herausgefunden, dass der richtige Weg für die Umsetzung darin besteht Sub-Classing UIWindow und Re-Implementieren der -sendEvent: -Methode. Hier ist, wie Sie es tun können. Erstellen Sie zuerst eine UIWindow-Unterklasse
%Vor%Beachten Sie, dass wir Variablen haben, die uns die UIView mitteilen, auf der Erkennen Sie die Ereignisse und den Controller, der das Ereignis empfängt Information. Implementieren Sie diese Klasse nun folgendermaßen:
%Vor%Implementieren Sie die sendEvent-Methode auf die obige Weise, und Sie können dann senden Geben Sie die gewünschten Informationen an den Controller zurück.
Es gibt einige Dinge, die man beachten sollte. Stellen Sie sicher, in Ihrem MainWindow.xib-Datei, das Fenster ist vom Typ TapDetectingWindow und nicht UIWindow. Nur dann werden alle Ereignisse das oben genannte durchlaufen sendEvent-Methode erneut implementiert. Stellen Sie außerdem sicher, dass Sie [super aufrufen sendEvent: event] zuerst und dann machen Sie was Sie wollen.
Jetzt können Sie Ihr UIWebView in der Controller-Klasse in der folgender Weg
%Vor%Denken Sie daran, dass Sie die Methode userDidTapWebView in Ihre schreiben müssen Controller-Klasse. Dies ist die Methode, die aufgerufen wird, um zu senden die Ereignisinformationen für die Controller-Klasse. In unserem Fall über uns senden den Punkt in der UIWebView, auf den der Benutzer geklickt hat.
Sie können sehr einfach einen UITapGestureRecognizer verwenden, um Tippgesten in einem UIWebView zu erkennen. Sie müssen jedoch eine UIGestureRecognizerDelegate-Methode implementieren, um die gleichzeitige Erkennung zu ermöglichen.
%Vor%Ich hatte mehrere Probleme bei der Verwendung von brian.clears Antwort (kopiert von einem ausgestorbenen Post von Mithin Kumar ) in meinem iOS 5-7 , universal , Storyboard- basiert , total ARC Projekt, also musste ich einige Änderungen vornehmen. Ich verbesserte auch einige Dinge und machte es leichter zu verstehen (zumindest für mich). Wenn Sie Probleme haben, diese Antwort von 2009 zu verwenden, sollten Sie vielleicht mein Update versuchen. Detaillierte Anweisungen:
TapDetectingWindow.h
%Vor%TapDetectingWindow.m
%Vor%window
deklariert ist Sie sollten so etwas in YourAppDelegate.h haben. Ändern Sie nicht den Namen der Eigenschaft!
%Vor%window
Ihres App-Delegaten Genau so sollte das in YourAppDelegate.m sein. Ändern Sie auch nicht den Namen der Methode!
%Vor%Achten Sie darauf, dass Sie das Protokoll zur Handhabung von Abzweigungen in Ihrem MainViewController.h
übernehmen %Vor%Geben Sie Ihre Webansicht an (eigentlich sollte jede UIView funktionieren) und tippen Sie in der (void) viewDidLoad -Methode
Ihres View-Controllers auf den Ereignishandler %Vor%Implementieren Sie einfach die userDidTapView -Methode in Ihrem View-Controller
%Vor%Ich bin mir der genauen Implementierungsdetails nicht sicher, aber Sie müssen UIWindow ableiten und sendEvent: überschreiben. Dann können Sie Tippereignisse erfassen und entsprechend behandeln, bevor sie in die Webansicht gelangen. Hoffe, das zeigt Ihnen in die richtige Richtung!
Erstellen Sie eine UIView
Unterklasse, die den gesamten UIWebView
enthält. Dann wird das Ereignis hitTest ausgelöst, wenn das Webview berührt wird. Hinweis: Legen Sie nichts außer dem WebView in den Container.
Überschreiben Sie dann das Ereignis hitTest:
%Vor%Ich habe alle oben genannten Methoden ohne Erfolg versucht. Bhupendras Antwort von Ссылка funktionierte perfekt für mich.