2011-06-22 84 views
17

我想在UIScrollView中有UIWebView。 UIWebView有时会超出iPhone屏幕的界限,因此我需要一种滚动视图的方式,以便可以看到所有内容(但我不想使用内置的UIWebView滚动功能)。所以我正在考虑将所有内容放在UIScrollView中,然后让UIScrollView的高度等于UIWebView和其中的其他视图的高度。UIScrollView中的iOS UIWebView

下面是一个图片来帮助说明我的问题:

Interface Builder Image

回答

37

我做同样的事情。以下是我做它的工作:

  1. 添加一个UIWebView作为的UIScrollView(当然;-)
  2. 禁用的UIWebView的本土滚动的子视图(你可以做到这一点通过的UIWebView的子视图迭代直到你找到它的UIScrollView并设置scrollEnabled = NO就可以了。
  3. 设置你的UIScrollView的contentSize和UIWebView中的帧到UIWebViews中的HTML内容的大小。

最后一点是有点棘手,因为你不能确保HTML完全是ren当webViewDidFinishLoad:在UIWebViewDelegate上被调用时被禁止。

这里有一个可靠的方式来获得HTML内容的大小:

1.增加一个JavaScript函数的HTML被调用时的HTML文档已准备就绪:

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

此功能发送请求在其URL中包含内容高度。

2.In您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

这里是斯威夫特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

人把它翻译成swift? –

+0

@YestayMuratov对不起,延迟回复。我在我的回答 – joern

+0

@joern中添加了一个Swift 2版本,如果HTML内容具有与附加到JS的“显示更多”链接(用于展开或加载和展开文章),那么将无法正常工作,对吧? – OgreSwamp