I am building an application that includes a UIWebView
containing a large number of images, CSS, embedded video, and JavaScript tap handlers. Scrolling performance is stuttery and I am looking for insight into the most effective ways to improve this.
Which if any of the following characteristics lead to laggy UIWebView
scrolling? What other factors may be hindering performance?
- Quantity of images
- Should I be removing images from the DOM as the user scrolls past them, and adding them back if they scroll back up?
- Size of images
- Will Retina-quality images in a web view affect scrolling performance a lot more than smaller versions would?
- Image scaling
- Would resizing the images ahead of time make a big difference, rather than relying on the web view to scale based on declarations like
width: 100%;
?
- Would resizing the images ahead of time make a big difference, rather than relying on the web view to scale based on declarations like
- CSS
- I have avoided
box-shadow
, but are there other CSS properties that are also known for adversely affecting scrolling performance?
- I have avoided
If there are any other resources or tools that can be used for profiling, I've love to hear about them.
This is the answer I got from Apple Developer Technical Support a while ago:
A possible alternative to UIWebView would be the open-source DTCoreText library: https://github.com/Cocoanetics/DTCoreText, which powers the Float Reader app: http://itunes.apple.com/us/app/float-reader/id447992005?mt=8
I had a similar issue a while ago. I found that putting the webview inside of a scrollview improved scroll performance dramatically. After the webview finished loading I disabled scrolling on the webview, set the webview's frame and the scrollview's contentSize to be the size of the webview's content.
I'm assuming that the webview doesn't load an image until it is about to appear on screen, which caused the stuttering, and by putting it in a scrollview and setting the frame to the content size it must load them ahead of time, but I'm not certain. I'm also sure this has consequences (ie, increased memory usage up front), but I never had any problems doing it this way.
The guys at LinkedIn have done extensive work with UIWebView and HTML5 on their iPad application. Their entire feed which is heavy with images, texts and videos is rendered inside a UIWebView.
The following blog post should give you lots of starting points to performance improvements
LinkedIn for iPad: 5 techniques for smooth infinite scrolling in HTML5