2012-04-15 3 views
14

Ich erstelle eine Anwendung, die eine UIWebView mit einer großen Anzahl von Bildern, CSS, eingebettetem Video und JavaScript-tap-Handler enthält. Scrolling-Performance ist stotternd und ich suche nach Einsichten in die effektivsten Wege, dies zu verbessern.Möglichkeiten zur Verbesserung der UIWebView-Scrollleistung?

Welche der folgenden Eigenschaften führt zu Laggy UIWebView Scrollen? Welche anderen Faktoren können die Leistung beeinträchtigen?

  • Anzahl der Bilder
    • Soll ich Bilder aus dem DOM beim Scrollen des Nutzers an sie vorbei zu entfernen, und das Hinzufügen von ihnen zurück, wenn sie wieder nach oben bewegen?
  • Größe der Bilder
    • Will Retina-Qualität Bilder in einer Web-Ansicht Affekt Scrollen Leistung viel mehr als kleinere Versionen würde?
  • Bildskalierung
    • würde die Bilder vor der Zeit macht einen großen Unterschied Ändern der Größe, anstatt auf der Web-Ansicht zu verlassen, wie width: 100%; auf Erklärungen maßstab basiert?
  • CSS
    • ich box-shadow hätte vermieden werden, aber es gibt auch andere CSS-Eigenschaften, die auch bekannt sind für sich negativ Scrollen Leistung zu beeinträchtigen?

Wenn es irgendwelche anderen Ressourcen oder Tools, die für die Profilerstellung verwendet werden kann, habe ich die Liebe zu ihnen zu hören.

Antwort

1

Ich hatte vor einer Weile ein ähnliches Problem. Ich habe festgestellt, dass das Scrollen mit der Webansicht innerhalb eines Scrollview die Scroll-Performance dramatisch verbessert hat. Nachdem die Webansicht fertig geladen wurde, deaktiviere ich das Scrollen in der Webansicht, setze den Rahmen der Webansicht und die contentSize der scrollview auf die Größe des Inhalts der Webansicht.

-(void) webViewDidFinishLoad:(UIWebView *)webView { 
    float size = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue]; 
    [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, size)]; 
    [webView setFrame:CGRectMake(webView.frame.origin.x, 
           webView.frame.origin.y, 
           webView.frame.size.width, 
           size)]; 

    [(UIScrollView*)[webView.subviews objectAtIndex:0] setScrollEnabled:NO]; 
} 

Ich gehe davon aus, dass die Webansicht kein Bild geladen werden, bis er im Begriff ist, auf dem Bildschirm angezeigt werden, die die Stottern verursacht wird, und indem sie in einem Scrollview und Einstellung des Rahmens an der Größe des Inhalts es setzen muss sie im Voraus laden, aber ich bin mir nicht sicher. Ich bin mir auch sicher, dass dies Konsequenzen hat (zB erhöhte Speicherauslastung), aber ich hatte nie Probleme damit.

+3

Ich-Stimme kann noch nicht geben, aber das ist eine ernste No-No. Diese Lösung bewirkt, dass das gesamte webView in seinen CALayer gezeichnet wird (wodurch der Tiling-Rendering-Mechanismus von UIWebView ungültig wird), was zu einer enormen Speicherbenutzung führt. OPs Beschreibung seiner Seiten "mit einer großen Anzahl von Bildern, CSS, eingebetteten Videos und JavaScript-Antipp-Handlern" würde dazu führen, dass die App übermäßig viel Speicher verbraucht. –

+2

Also, was Sie sagen, ist ich Speicher für Leistung getauscht? Das ist irgendwie was ich dachte. Ich stimme zu, dass es keine großartige Lösung ist, aber es war die einzige Möglichkeit, das Scrollen zu verbessern. Und da ich genau wusste, was im Vorfeld in die Webansicht geladen werden würde und alle Inhalte mit der App gebündelt waren, hatte ich kein Problem damit. – rjowens

+1

Nun, diese Art des Handels ist sehr gefährlich mit UIWebView, weil es sehr schnell und aggressiv im Speicher wächst. Und wenn Inhalte größer und komplexer werden, werden Sie bald eine Flut von didReceiveMemoryWarning-s finden und schließlich abstürzen. –

8

Dies ist die Antwort, die ich vor einer Weile von Apple Developer Technical Support erhielt:

Zu dieser Zeit bieten wir keine Mechanismen, um die Wiedergabe von UIWebView zu optimieren. Der Grund, warum Sie einen Unterschied sehen, liegt daran, dass Mobile Safari und UIWebView nicht dieselbe Rendering-Engine verwenden.

Die Leistung hängt vom geladenen Inhalt ab. Wenn Javascripts ausgeführt werden oder Plugins verwendet werden, kann dies die Leistung beeinträchtigen.

Ich empfehle, dass Sie einen Fehlerbericht unter http://developer.apple.com/bugreporter/ einreichen, in dem Ihre Situation beschrieben wird. Dies wird Sie auch über den Status Ihres Fehlerberichts auf dem Laufenden halten.

Eine mögliche Alternative zu UIWebView würde die Open-Source-DTCoreText Bibliothek sein: https://github.com/Cocoanetics/DTCoreText, die Befugnisse der Float Reader App: http://itunes.apple.com/us/app/float-reader/id447992005?mt=8

+0

Ich weiß, dass die Leistung vom geladenen Inhalt abhängt. Ich versuche zu verstehen, welche Änderungen an meinen Inhalten (z. B. kleinere Bilder, weniger Bilder, Vermeidung bestimmter CSS-Eigenschaften usw.) den größten Effekt haben. –