IOS UIWebView внутри UIScrollView

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

Здесь изображение, которое поможет описать мою проблему:

Interface Builder Image

Ответ 1

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

  • Добавить UIWebView в качестве подзадачи UIScrollView (очевидно, -)
  • Отключить собственную прокрутку UIWebView (вы можете сделать это, итерации через subviews UIWebView, пока не найдете его UIScrollView и установите для него scrollEnabled = НЕТ.
  • Установите размер содержимого вашего 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
}