Bildlauf auf einer UIWebView deaktivieren erlaubt?


90

Ich muss einen Webartikel mit einem UITableViewunter dem Artikel zeigen.

Die einzige Option, die ich gefunden habe, war, den Artikel in einem UIWebViewim tableView-Header anzuzeigen.

Dazu muss ich die Höhe des WebView-Inhalts ermitteln und das Scrollen für das WebView deaktivieren.

Ich habe zwei Lösungen gefunden, um das Scrollen zu deaktivieren:

for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).scrollEnabled=NO;

oder in JavaScript:

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

Ich habe gehört, dass die erste Lösung von Apple verboten ist, aber ich habe keinen Beweis dafür. Wird meine Bewerbung mit dieser Lösung abgelehnt? Wenn ja, kann ich die zweite Lösung verwenden, ohne abgelehnt zu werden?

Antworten:


297

Ab iOS5 haben wir direkten Zugriff auf die Bildlaufansicht der UIWebView.
Sie können das Scrollen und Bouncen wie folgt deaktivieren:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

3
Vielen Dank, genau das habe ich gesucht. @jsddour, du solltest diese Antwort als akzeptiert markieren!
Marcgg

Aus irgendeinem Grund funktioniert das bei mir nicht. :-( Ich habe eine ScrollView und eine UIWebView eingefügt. Dann setzen Sie die obigen 2 Zeilen in der viewWillAppear-Methode. Aber die Schriftrolle funktioniert immer noch in der Webansicht. Kann jemand helfen? Nur zur Information, ich führe sie aus iOS 7 Simulator.
Amogh Natu

Was nützt das webView.scrollView.bounces = NO;? da der Code in der ersten Zeile das Scrollen deaktiviert hat.
Gon

1
Ich liebe es, wenn Leute eine Antwort nehmen und rennen, ohne sich die Zeit zu nehmen, dem Mitwirkenden eine positive Stimme zu geben. Gibt es keine Möglichkeit, den Benutzer zu benachrichtigen, um eine Antwort zur Abstimmung auszuwählen?
John Cogan

1
für schnelle webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva

26

Da diese Frage immer noch anwendbar ist, gibt es einen neuen Weg, dies zu tun! (iOS 7.0+, vielleicht auch iOS 6, nicht bestätigt)

webView.scrollView.scrollEnabled = NO;

Pass auf :)


Was ich nicht verstehe ist, warum das nicht in IB ist: /, cmon APPLE was machst du? Trotzdem sehr schöne Lösung!
Mahmud Ahmad

20

Sie können einfach die Benutzerinteraktionseigenschaft für die Webansicht auf no setzen, dh

webView.userInteractionEnabled = NO;

Es ist ziemlich einfach und funktioniert gut, danke :)


28
Dies verhindert jedoch, dass Links abgehört werden.
Graham Perks

@ AbrahamPerks Ich habe die Antwort in Bezug auf Ihren Kommentar bearbeitet, bitte überprüfen Sie sie und genehmigen Sie, danke :)
Eshwar Chaitanya

12

Für alle iOS-Versionen können Sie diesen Code anstelle von setScrollEnabled verwenden:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}

Zuerst versuche ich die "setScrollEnabled" -Methode und Apple hat meine IPA abgelehnt. Dann habe ich diese Methode geändert und akzeptiert.
Mturhan55

12

Verwende das hier <body ontouchmove="event.preventDefault()">


9

SWIFT 3 Version

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false

7

Ich denke das Javascript

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

ist bei weitem die beste Lösung.

Tatsächlich :

Dein erstes Beispiel oder das

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

Eine (gleiche Sache) könnte abgelehnt werden, weil sie nicht dokumentiert ist, oder Ihre App in einem weiteren iOS-Update zum Absturz bringen.

Und das

[[myWebView scrollView] setBounces:NO];

Methode funktioniert nicht mit iOS <5.


5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

das hat es für mich sortiert


4
Es wäre so falsch, sich darauf zu verlassen, da es sich nicht um eine exponierte API handelt.
Deepak Danduprolu

[[[WebView-Unteransichten] lastObject] setScrollingEnabled: NO]; das hat es für mich sortiert. Jedenfalls beantwortet es meine Frage nicht. Meine Frage ist, ob ich das darf? Es scheint, dass das Deaktivieren des Bildlaufs durch das SDK verboten ist. Aber ich bin mir nicht sicher. Und was ist mit dem Deaktivieren des Bildlaufs durch Javascript?
jsaddour

Es gibt keine Hinweise darauf, dass mein Vorschlag eine Ablehnung durch Apple, infact, verursachen würde, indem die letzte Unteransicht im Array "Subviews" aufgerufen und scrollingEnabled dagegen eingestellt wird. API? sicherlich?. und ja, mach es, weil du es benutzen kannst. Keine Ahnung über Javascript. Es tut uns leid.
TheiOSDude

3
Nein, das solltest du nicht tun. Wie Deepak sagt, können Sie sich nicht auf die undokumentierte interne Reihenfolge der Unteransichten in einem der UI-Elemente von Apple verlassen. Wenn sie die interne Struktur in einem zukünftigen Betriebssystem-Update ändern, stürzt Ihre Anwendung ab. Sie warnen ausdrücklich davor, dies an mehreren Stellen zu tun, und viele Anwendungen haben das Upgrade auf iPhone OS 3.0 abgebrochen, nur weil sie dies getan haben.
Brad Larson

5

Der erste wird von Apple abgelehnt. Es ist mir erst heute Morgen passiert.



4

Ich glaube nicht, dass die erste Option von Apple verboten ist.

Du könntest es versuchen

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

Wenn Sie nicht möchten, dass Links in Ihrer UIWebView funktionieren, können Sie dies auch tun

[myWebView setUserInteractionEnabled:NO];

4

Benutze es :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];

3

Versuche dies,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    

3

Ich habe einige UIWebViews in a platziert UIScrollViewund es wurde für mich nicht gescrollt, es sei denn, ich deaktiviere die Benutzerinteraktion in den Webansichten (auch mit der [[webview scrollview] setScrollEnabled:NO]). Also habe ich das UIWebViews in a platziert UIViewund das hat bei mir funktioniert, aber dann funktionierten die interaktiven Links oder Divs in meinem HTML-Code in UIWebViewnicht mehr.

Das einzige, was für mich funktioniert hat, ist, das UIWebViewInnere im Inneren zu behalten, UIScrollViewdamit die HTML-Interaktionen funktionieren, das UIScrollingaber nicht.

Ich habe dann einen benutzerdefinierten Delegaten erstellt, auf den die Webansichten window.open("http:/customEvent")warten sollen. Dieser wird aus dem in der Webansicht enthaltenen HTML-Code aufgerufen. Ich habe auch eine JavaScript-Swipe-Erkennung hinzugefügt, die mein benutzerdefiniertes Ereignis auslöst.

Wenn der Webview-Delegat dies erhält, übergebe ich eine Benachrichtigung an einen Controller, der dann dynamisch einen Bildlauf durchführt UIScrollView. Offensichtlich musste ich eine Logik erstellen, um zu überwachen und zur nächsten oder vorherigen Seite zu scrollen. Nicht die schönste Lösung, aber es funktioniert für mich.


3

Versuchen Sie dies in Ihrem HTML ( <HEAD>Tag)

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

Das Scrollen auf Ihrer Webseite wird deaktiviert.

(funktioniert auf jeder Webseite, nicht nur auf UIWebView)


2

Ich musste das Scrollen deaktivieren, da das Löschen einer benutzerdefinierten Tastatur das Scrollen mit der WebView wirklich durcheinander brachte. Nichts anderes hat funktioniert und ich habe auf so etwas zurückgegriffen:

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}

1

Entspricht eine UIWebview und eine UITableView in einer UIScrollview und das Festlegen der Höhe der Webview (und das Hinzufügen zur gesamten ContentSize der Scrollview) Ihren Wünschen?


Fast. Es scheint jedoch weniger kompliziert zu sein, das WebView im tableView-Header anzuzeigen. Aber meine Frage ist: Ich darf den WebView-Bildlauf durch das SDK deaktivieren. Wenn nicht, darf ich das durch Javascript machen?
Jsaddour

1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

1
Es wird bis zum Update funktionieren, bei dem sich die Position der Bildlaufansicht ändern würde
Martin,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.