2011-06-22 33 views
17

Chcę mieć UIWebView wewnątrz UIScrollView. UIWebView czasami wychodzi 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). Zastanawiam się więc nad umieszczeniem całej zawartości w UIScrollView, a następnie podniesieniem wysokości UIScrollView do wysokości UIWebView i innych widoków, które się w nim znajdują.iOS UIWebView wewnątrz UIScrollView

Oto obraz, który ma pomóc opisując mój problem:

Interface Builder Image

Odpowiedz

37

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

  1. Dodaj UIWebView jako podrzędny w UIScrollView (oczywiście ;-)
  2. wyłączyć rodzimy przewijanie UIWebView (można to zrobić przez iteracja subviews w UIWebView aż znajdziesz to UIScrollView i ustawić scrollEnabled = brak na nim.
  3. Ustawianie contentSize Twojego UIScrollView i ramka na UIWebView do rozmiaru zawartości UIWebViews HTML.

ostatni punkt jest nieco kłopotliwe, ponieważ nie można upewnij się, że HTML jest całkowicie ren dered, gdy webViewDidFinishLoad: zostaje wywołany na UIWebViewDelegate.

Oto niezawodny sposób, aby uzyskać zawartość HTML rozmiar:

1.Add funkcji javascript do HTML, który zostanie wywołany, kiedy dokument HTML jest gotowy:

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

Funkcja ta wysyła żądanie ma wysokość treści w adresie URL.

2.In swojej UIWebViewDelegate przechwycić tę prośbę:

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

nadzieję, że pomoże

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 
} 
+0

Może ktoś przetłumaczyć na szybki? –

+0

@YestayMuratov Przepraszamy za spóźnioną odpowiedź. Dodałem wersję Swift 2 do mojej odpowiedzi – joern

+0

@joern, która nie zadziała, jeśli treść HTML ma coś w stylu "Pokaż więcej" z dołączonym JS (aby rozwinąć lub załadować i rozwinąć artykuł), prawda? – OgreSwamp

Powiązane problemy