我想在UIScrollView中放置一个UIWebView。由于UIWebView有时会超出iPhone屏幕的边界,所以我需要一种滚动视图的方法来查看所有内容(但我不想使用UIWebView内置的滚动)。因此,我考虑将所有内容放在UIScrollView中,然后使UIScrollView的高度等于UIWebView和其中其他视图的高度。
这里是一张图片,以帮助描述我的问题:
这里是一张图片,以帮助描述我的问题:
最后一点有些棘手,因为你无法确定HTML是否在UIWebViewDelegate中的webViewDidFinishLoad:被完全渲染。
以下是一个可靠的获取HTML内容大小的方法:
1.在HTML中添加一个javascript函数,在HTML文档准备就绪时调用:
window.onload = function() {
window.location.href = "ready://" + document.body.offsetHeight;
}
这个函数会发送一个带有内容高度参数的请求。
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
}
UIWebView
内部的UIScrollView
的contentSize
,并在contentView
的高度更改时更改UIWebView
的高度。 - joern