iOS UIWebView внутри UIScrollView - PullRequest
18 голосов
/ 22 июня 2011

Я хочу иметь UIWebView внутри UIScrollView.UIWebView иногда выходит за пределы экрана iPhone, поэтому мне нужен способ прокрутки представления, чтобы я мог видеть весь контент (но я не хочу использовать встроенную прокрутку UIWebView).Так что я думаю о том, чтобы поместить весь контент в UIScrollView, а затем сделать высоту UIScrollView равной высоте UIWebView и других представлений в нем.

Вот изображение, помогающее описать мою проблему:

Interface Builder Image

1 Ответ

38 голосов
/ 24 июня 2011

Я сделал то же самое. Вот как я это сделал:

  1. Добавить UIWebView в качестве подпредставления UIScrollView (очевидно; -)
  2. Отключите собственную прокрутку UIWebView (вы можете сделать это, просматривая подпредставления UIWebView, пока не найдете его UIScrollView и не установите для него scrollEnabled = NO.
  3. Установите для contentSize вашего UIScrollView и фрейма UIWebView размер HTML-содержимого UIWebViews.

Последний пункт немного сложен, потому что вы не можете быть уверены, что HTML полностью отображается при вызове webViewDidFinishLoad: для UIWebViewDelegate.

Вот надежный способ получить размер содержимого HTML:

1.Добавьте функцию JavaScript в HTML, которая вызывается, когда документ HTML готов:

window.onload = function() {
    window.location.href = "ready://" + document.body.offsetHeight;
}

Эта функция отправляет запрос с высотой содержимого в своем URL.

2.В своем UIWebViewDelegate вы перехватываете этот запрос:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
        NSURL *url = [request URL];
        if (navigationType == UIWebViewNavigationTypeOther) {
           if ([[url scheme] isEqualToString:@"ready"]) {
               float contentHeight = [[url host] floatValue];
               yourScrollView.contentSize = CGSizeMake(yourScrollView.frame.size.width, contentHeight + yourWebView.frame.origin.y);
               CGRect fr = yourWebView.frame;
               fr.size = CGSizeMake(yourWebView.frame.size.width, contentHeight);
               yourWebView.frame = fr;

               return NO;       
        }

        return YES;
}

Надеюсь, это поможет

UPDATE

Вот версия Swift 2:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    guard navigationType == .Other else { return true }
    if let url = request.URL, let host = url.host {
        guard url.scheme == "ready" else { return true }
        if let contentHeight = Float(host) {
            yourScrollView.contentSize = CGSizeMake(yourScrollView.bounds.size.width, CGFloat(contentHeight))
            var fr = webView.frame
            fr.size = CGSizeMake(fr.size.width, CGFloat(contentHeight))
            webView.frame = fr
        }

        return false
    }

    return true
}
...