2011-06-22 11 views
17

Quiero tener UIWebView dentro de UIScrollView. El UIWebView a veces saldrá de los límites de la pantalla del iPhone, así que necesito una forma de desplazar la vista para que pueda ver todo el contenido (pero no quiero usar el desplazamiento integrado de UIWebView). Así que estoy pensando en poner todo el contenido dentro de UIScrollView y luego hacer que el alto de UIScrollView sea igual al alto de UIWebView y otras vistas que hay en él.iOS UIWebView dentro de UIScrollView

Aquí está una imagen para ayudar a describir mi problema:

Interface Builder Image

Respuesta

37

hice exactamente lo mismo. Así es como yo hice que funcionara:

  1. Añadir la UIWebView como una vista secundaria de la UIScrollView (obviamente ;-)
  2. Desactivar el desplazamiento natural de la UIWebView (se puede hacer eso por iteración a través de los subvistas del UIWebView hasta que encuentre que es UIScrollView y establecer scrollEnabled = nO en él.
  3. Ajuste el contentSize de su UIScrollView y el marco de la UIWebView al tamaño del contenido UIWebViews HTML.

el último punto es poco complicado porque no se puede asegúrese de que el HTML esté completamente dered cuando webViewDidFinishLoad: se llama en el UIWebViewDelegate.

Aquí está una manera confiable para obtener el tamaño de contenido HTML:

1.Add una función JavaScript para el código HTML que se llama cuando el documento HTML está listo:

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

Esta función envía una solicitud que tiene la altura del contenido en su URL.

2.In su UIWebViewDelegate que intercepta esta solicitud:

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

Espero que ayude

ACTUALIZACIÓN

Aquí está la versión 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 
} 
Puede alguien
+0

traducirlo a veloz? –

+0

@YestayMuratov Perdón por la respuesta tardía. Agregué una versión Swift 2 a mi respuesta – joern

+0

@joern que no funcionará si el contenido HTML tiene algo así como el enlace "Mostrar más" con JS adjunto (para expandir o cargar y expandir un artículo), ¿verdad? – OgreSwamp

Cuestiones relacionadas