10

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.

hol
  • 8,255
  • 5
  • 33
  • 59

4 Answers4

26

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.

halfer
  • 19,824
  • 17
  • 99
  • 186
Pawel
  • 4,699
  • 1
  • 26
  • 26
  • 1
    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. – hol Aug 29 '10 at 14:49
  • 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 Aug 29 '10 at 18:11
  • 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` – Joost Aug 29 '10 at 18:21
  • 1
    If you're displaying a PDF or other document in your UIWebView, the document.body.offsetHeight shown above won't return a value. However, you can use window.outerHeight and window.innerHeight instead, as shown here: http://stackoverflow.com/questions/1927841/is-there-a-way-to-programmatically-scroll-to-a-pdf-page-within-a-uiwebview#4967362 – arlomedia Jul 20 '11 at 19:49
9

in iOS 5+ you could call the following method from your -(void)webViewDidFinishLoad:(UIWebView *)webView

- (void)webViewScrollToBottom:(UIWebView *)webView
{
    CGFloat scrollHeight = webView.scrollView.contentSize.height - webView.bounds.size.height;
    if (0.0f > scrollHeight)
        scrollHeight = 0.0f;
    webView.scrollView.contentOffset = CGPointMake(0.0f, scrollHeight);
}
demosten
  • 3,301
  • 2
  • 25
  • 18
4

This is how you can scroll down Animated:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
        CGPoint bottomOffset = CGPointMake(0, self.myWebView.scrollView.contentSize.height - self.myWebView.scrollView.bounds.size.height);
        [self.myWebView.scrollView setContentOffset:bottomOffset animated:YES];
}
Oded Regev
  • 4,065
  • 2
  • 38
  • 50
1

SWIFT 4.x

This is how you can scroll down Animated:

func webViewDidFinishLoad(_ webView: UIWebView) {
    var scrollHeight: CGFloat = webView.scrollView.contentSize.height - webView.bounds.size.height
    if (0.0 > scrollHeight) {
        scrollHeight = 0.0
    }
    webView.scrollView.setContentOffset(CGPoint.init(x: 0.0, y: scrollHeight), animated: true)
}
Argus
  • 2,241
  • 1
  • 22
  • 27