views:

70

answers:

1

I know a similar question has been asked before but it seemed never been answered. I have a UIWebView and add some content by string. I use UIWebView because I add some images to it dynamically and also use other HTML features. This example code is simplified.

NSString *myHtmlString = @"SOME LONG TEST STRING 1234567890 123456789 0123456789 0123456789 0123456789 01234567890 WWWWWWWWWW WWWWWWWWWW WWWYYYYYYY YYYYYYYYYY YYYYYYYYYY YYYYYYYYYY YYYYYYYYYY YYYYYYYYY YYYYYYYWWW WWWWWWWWWW WWWWWWWWWW WWWXXXXXXX XXXXXXXXXX XXXZZZZZZZ THIS IS THE END I WANT TO SEE";
NSString *myPath = [[NSBundle mainBundle] bundlePath];
NSURL *myBaseURL = [NSURL fileURLWithPath:myPath];
[myWebView loadHTMLString:myHtmlString baseURL:myBaseURL];

What I want to see is the end of the string. I can scroll there, no problem. But I want to go there programatically.

+3  A: 

This is fairly simple. First, you'll need to obtain height of the webpage:

NSInteger height = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] intValue];

Now you have the height of the document stored in the height variable. To scroll to bottom you have to use javascript again:

NSString* javascript = [NSString stringWithFormat:@"window.scrollBy(0, %d);", height];   
[webView stringByEvaluatingJavaScriptFromString:javascript];

Of course you need to call them in proper moment. That is

– webViewDidFinishLoad:(UIWebView *)webView

method of your webview delegate.

Hope this was helpful, Pawel

Pawel
Okay. I made it working. The point is that this has to be done in "the" webViewDelegate. I had no web View delegate so I wrote a class and implementing the webViewDelegate. I have put above code in it (NB: it should be "window.scrollBy(0,%d)") and it worked. It really is important to do it AFTER the load finished.
Jürgen Hollfelder
The webViewDidFinishLoad always gets called after the webview finished loading the page, so you're completly safe. :) I've corrected the code, thanks for the tip!
Pawel
Can't you just scroll to `NSIntegerMax`? You're now scrolling the page offscreen, as you scroll to `{0, pageHeight}` so not leaving any content to be shown (then it should have been `{0, pageHeight - webViewHeight}`). Since it doesn't scroll offscreen, it means that the browser limits the scroll position and thus you may pass `NSIntegerMax`
JoostK