9 Stimmen

ScrollOffset in UIWebView?

Ich habe eine wirklich harte Zeit, Delegierte und Objektvererbung zu verstehen (wenn ich dieses Wort verwenden darf) und ich denke, ich brauche eine einfache (oder so denke ich) Sache: fangen scrollViewDidScroll Ereignis in UIWebView und erhalten Offset (im Grunde nur zu wissen, wenn Scroll nicht auf oben/unten, so dass ich Navigation und Registerkartenleisten ausblenden könnte).

Gibt es eine Möglichkeit, wie ich das tun kann? Ich verwende bereits UIWebviewDelegate in meinem Viewcontroller zu "shouldStartLoadWithRequest". Vielleicht könnte ich irgendwie UIScrollViewDelegate auch für scrollViewDidScroll verwenden? Wenn ja, dann wie?

Ich habe wirklich Schwierigkeiten, Delegierte zu verstehen. Ich habe einige Artikel gelesen, aber in der Praxis schaffe ich es trotzdem nicht, sie zu verwenden.

Jede Hilfe oder Information wäre schön.

Vielen Dank im Voraus!

13voto

CedricSoubrie Punkte 6537

Um Scroll-Ereignisse auf UIWebView abzurufen, verwende ich persönlich diesen Code, um die Scrollview zu erhalten, die innerhalb der UIWebView ist:

- (void) addScrollViewListener
{
    UIScrollView* currentScrollView;
    for (UIView* subView in self.myWebView.subviews) {
        if ([subView isKindOfClass:[UIScrollView class]]) {
            currentScrollView = (UIScrollView*)subView;
            currentScrollView.delegate = self;
        }
    }
}

Es klappt. Sie können es auch verwenden, um [currentScrollView setContentOffset:offSet animated:YES]; Das einzige Problem könnte darin bestehen, die Apple-Codeprüfung nicht zu bestehen. Ich weiß es noch nicht, da ich noch in der Kodierungsphase bin.

[UPDATE] Die App mit diesem Code ist jetzt seit 4 Monaten im App Store und wird von 40 000 Nutzern verwendet. Ich hatte keine Probleme [UPDATE]

7voto

Biranchi Punkte 15619

Sie können die folgenden Methoden anwenden, um Ihr Problem zu lösen.

Um den pageOffset zu erhalten:

int pageYOffset = [[webViewObj stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] intValue];

Zur Ermittlung der gesamten Bildlaufhöhe einer Webseite:

int scrollHeight = [[webViewObj stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight"] intValue];

Zum Scrollen der Webseite zu einem bestimmten Offset:

[webViewObj stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.scrollTop = %d",scrollHeight ]];

4voto

Graeme Wicksted Punkte 51

Ich habe eine Änderung vorgenommen, um die Klasse mit isKindOfClass zu erkennen. Funktioniert - kann aber Probleme mit Apple-Code-Prüfung wie oben angegeben haben.

UIScrollView* currentScrollView;
for (UIView* subView in terms.subviews) {
    if ([subView isKindOfClass:[UIScrollView class]]) {
        NSLog(@"found scroll view");
        currentScrollView = (UIScrollView *)subView;
        currentScrollView.delegate = self;
    }
}

4voto

MweyaMutsvene Punkte 543

Altes Thema, ich weiß -

Ab iOS 5.0 können Sie Folgendes verwenden

myAccountWebView.scrollview

um auf die Größe und den Versatz des Inhalts zuzugreifen.

2voto

Sixten Otto Punkte 14771

Es gibt eine Bildlaufansicht in der UIWebView aber es ist a) kein UIScrollView und b) ist etwas, das Apple als privates Implementierungsdetail betrachtet (und das sollten Sie auch). Ich habe eigentlich nur zwei Vorschläge:

  1. Reichen Sie einen Bug bei Apple ein und fordern Sie sie auf, mehr von der Infrastruktur der Web-Ansicht offenzulegen, oder fügen Sie zumindest einige weitere Delegatmethoden hinzu, durch die wir über diese Art von Ereignissen benachrichtigt werden können.
  2. Fügen Sie Ihrer Seite einen JavaScript-Code hinzu, der auf Scroll-Ereignisse reagiert und Ihre Anwendung darüber informiert.

Die grundlegende Grundlage von #2 ist eine gefälschte URL zu laden, und haben Sie Ihre Web-View-Delegat Prozess (und Abbrechen!), dass die Last. (Diese Frage ist ein paar Mal hier auf Stack Overflow aufgetaucht).

UPDATE:

Seit iOS 5 gibt es nun eine öffentlich scrollView Eigentum an UIWebView die Sie verwenden können, um das Bildlaufverhalten anzupassen. Die genaue Ansichtshierarchie der Webansicht bleibt ein undokumentiertes Implementierungsdetail, aber dies gibt Ihnen einen sanktionierten Weg, um auf diesen Teil der Ansicht zuzugreifen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X