使用“自动布局”将UIWebView设置为其内容的高度

时间:2015-10-21 14:51:54

标签: ios swift uiwebview autolayout

我在滚动视图中嵌入了一个Web视图,我希望“展开”Web视图以显示其所有内容,然后我想用滚动视图滚动浏览。

我使用滚动视图作为超级视图并且不仅仅使用Web视图作为滚动视图的原因是因为我在Web视图上方有我想要包含在滚动过程中的标签(参见屏幕截图)。 / p>

那么如何让webview自行调整大小,以便占用显示其所包含内容所需的所有空间?

之后,如何根据webview的大小调整superview(Scroll视图)的大小?

1

2

2 个答案:

答案 0 :(得分:29)

要完成这项工作,您必须执行以下步骤:

  1. 将笔尖中的UIWebView连接到视图控制器中的插座
  2. 在网络视图中禁用滚动
  3. 在网页视图顶部设置UIScrollViewUIView上的约束(在我的示例中,我省略了该视图中的所有标签)和UIWebView
  4. 将UIWebView的height约束连接到视图控制器中的插座。
  5. 将视图控制器设置为UIWebViewDelegate
  6. webViewDidFinishLoad中,将高度约束的常量设置为Web视图内滚动视图的contentSize的高度。
  7. 启动键值观察contentSize以更改高度,当Web视图的高度必须更改时,因为网页的各个部分会更改其大小而不重新加载页面(如手册或菜单)。
  8. 我不会详细解释这些约束,因为你似乎已经把它们弄清楚了。以下是约束的屏幕截图:

    enter image description here

    所以,这是代码:

    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, forKeyPath: "contentSize", 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, ofObject: object, change: change, context: context)
            }
        }
    }
    
    extension ViewController: UIWebViewDelegate {
        func webViewDidFinishLoad(webView: UIWebView) {
            print(webView.request?.URL)
            webviewHeightConstraint.constant = webview.scrollView.contentSize.height
            if (!observing) {
                startObservingHeight()
            }
        }
    }
    

答案 1 :(得分:4)

来自@joern的出色解决方案。对我来说很好。我只是将他的代码改编为swift 3.

Swift 3更新代码:

我还修改了stopObservingHeight,以防止在创建之前删除观察者。

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.isScrollEnabled = 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() {
    if observing {
        webView.scrollView.removeObserver(self, forKeyPath: "contentSize", context: &MyObservationContext)            
        observing = false
    }
}

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    guard let keyPath = keyPath,
        let context = context else {
        super.observeValue(forKeyPath: nil, of: object, change: change, context: nil)
        return
    }
    switch (keyPath, context) {
    case("contentSize", &MyObservationContext):
        webviewHeightConstraint.constant = webview.scrollView.contentSize.height
    default:
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    }

}
}

extension ViewController: UIWebViewDelegate {
    func webViewDidFinishLoad(_ webView: UIWebView) {
        print(webView.request?.url ?? "nil")
        webviewHeightConstraint.constant = webview.scrollView.contentSize.height
        if (!observing) {
            startObservingHeight()
        }
    }
}