我做了同样的事情。以下是我的工作方式:
- 将 UIWebView 添加为 UIScrollView 的子视图(显然 ;-)
- 禁用 UIWebView 的本机滚动(您可以通过遍历 UIWebView 的子视图来做到这一点,直到找到它是 UIScrollView 并在其上设置 scrollEnabled = NO。
- 将 UIScrollView 的 contentSize 和 UIWebView 的框架设置为 UIWebViews HTML 内容的大小。
最后一点有点棘手,因为当 webViewDidFinishLoad: 在 UIWebViewDelegate 上被调用时,您无法确定 HTML 是否完全呈现。
这是获取 HTML 内容大小的可靠方法:
1.在 HTML 文档准备好时调用的 HTML 中添加一个 javascript 函数:
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;
}
希望有帮助
更新
这里是 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
}