我已经在一个滚动视图中嵌入了一个网页视图,我希望网页视图被“扩展”,以显示所有的内容,然后我想滚动浏览滚动视图.
我使用滚动视图作为超级视图的原因,而不仅仅是将网页视图用作滚动视图是因为我在滚动过程中要包含在Web视图上方的标签(请参阅屏幕截图).
那么如何使webview自动调整大小,因此它占用了显示其包含的内容所需的所有空间.
之后,如何使超级视图(滚动视图)根据网络视图的大小自行调整大小?
解决方法
要做这项工作,您必须执行以下步骤:
>将UIWebView从nib连接到视图控制器中的插座
>禁用在Web视图中滚动
>在UIScrollView上设置约束,UIView在Web视图的顶部(在我的示例中,我省略了该视图中的所有标签)和UIWebView.
>将UIWebView的高度约束连接到视图控制器中的插座.
>将视图控制器设置为UIWebViewDelegate
>在webViewDidFinishLoad中,将height约束的常量设置为Web视图中滚动视图的contentSize的高度.
>开始键值观察contentSize以更改高度,当网页视图的高度必须更改时,因为网页的各个部分在不重新加载页面的情况下更改其大小(如分页符或菜单).
我不会详细解释这些限制,因为你似乎已经把自己弄清楚了.这是一个限制的截图:
所以,这里是代码:
import UIKit
var MyObservationContext = 0
class ViewController: UIViewController {
@IBOutlet weak var webview: UIWebView!
@IBOutlet weak var webviewHeightConstraint: NSLayoutConstraint!
var observing = false
override func viewDidLoad() {
super.viewDidLoad()
webview.scrollView.scrollEnabled = false
webview.delegate = self
webview.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.de/intl/de/policies/terms/regional.html")!))
}
deinit {
stopObservingHeight()
}
func startObservingHeight() {
let options = NSkeyvalueObservingOptions([.New])
webview.scrollView.addobserver(self,forKeyPath: "contentSize",options: options,context: &MyObservationContext)
observing = true;
}
func stopObservingHeight() {
webview.scrollView.removeObserver(self,context: &MyObservationContext)
observing = false
}
override func observeValueForKeyPath(keyPath: String?,ofObject object: AnyObject?,change: [String : AnyObject]?,context: UnsafeMutablePointer<Void>) {
guard let keyPath = keyPath else {
super.observeValueForKeyPath(nil,ofObject: object,change: change,context: context)
return
}
switch (keyPath,context) {
case("contentSize",&MyObservationContext):
webviewHeightConstraint.constant = webview.scrollView.contentSize.height
default:
super.observeValueForKeyPath(keyPath,context: context)
}
}
}
extension ViewController: UIWebViewDelegate {
func webViewDidFinishLoad(webView: UIWebView) {
print(webView.request?.URL)
webviewHeightConstraint.constant = webview.scrollView.contentSize.height
if (!observing) {
startObservingHeight()
}
}
}