iOS UIWebView wewnÄ…trz UIScrollView

Chcę mieć UIWebView wewnątrz UIScrollView. UIWebView czasami wyjdzie poza granice ekranu iPhone ' a, więc potrzebuję sposobu na przewinięcie widoku, aby zobaczyć całą zawartość (ale nie chcę korzystać z wbudowanego przewijania UIWebView). Myślę więc o umieszczeniu całej zawartości wewnątrz UIScrollView, a następnie uczynieniu wysokości UIScrollView równą wysokości UIWebView i innych widoków, które są w nim.

Oto obrazek, który pomoże opisać mój problem:

Interface Builder Image

Author: Peter Warbo, 2011-06-22

1 answers

Zrobiłem dokładnie to samo. Oto jak to działa:

  1. Dodaj UIWebView jako subview UIScrollView (oczywiście ;-)
  2. Wyłącz natywne przewijanie UIWebView (możesz to zrobić poprzez iterację w podglądzie UIWebView, aż znajdziesz UIScrollView i ustaw scrollenabled = NO na nim.
  3. Ustaw rozmiar zawartości UIScrollView i ramki UIWebView na rozmiar zawartości HTML UIWebView.

Ostatni punkt to bit trudne, ponieważ nie możesz być pewien, że HTML jest całkowicie renderowany, gdy webViewDidFinishLoad: zostanie wywołany na UIWebViewDelegate.

Oto niezawodny sposób na uzyskanie rozmiaru zawartości HTML:

1.Dodaj funkcję javascript do HTML, która zostanie wywołana, gdy dokument HTML jest gotowy:

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

Ta funkcja wysyła żądanie, które ma wysokość zawartości w adresie URL.

2.In Twój UIWebViewDelegate przechwycić to żądanie:

- (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;
}

Mam nadzieję, że pomaga

UPDATE

Oto wersja 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
}
 38
Author: joern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-13 08:50:58