UIWebView dynamic content size

后端 未结 9 1572
北海茫月
北海茫月 2020-12-01 09:21

I\'ve been looking around and wasnt able to see any swift related ways to do this. I\'m trying to get my UIWebViews height to be dynamic. I have a UIWebView that loads data

相关标签:
9条回答
  • 2020-12-01 09:56

    When font change at that time change Webview height to 1 than get proper offsetHeight for Webview

    webView1.frame.size.height = 1
    
    0 讨论(0)
  • 2020-12-01 09:57

    Here is my custom class to work with custom UIWebViews, it has everything in it to get the correct scrollview content height, set UIWebView height and create a custom height constraint to get autolayout working. It also loads some custom CSS styling...

    class CustomUIWebView: UIWebView, UIWebViewDelegate {
    
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            self.scrollView.scrollEnabled = false
            self.scrollView.bounces = false
            self.delegate = self
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            self.scrollView.scrollEnabled = false
            self.scrollView.bounces = false
            self.delegate = self
        }
    
        override func loadHTMLString(string: String!, baseURL: NSURL!) {
            var cssURL:String = NSBundle.mainBundle().pathForResource("webview", ofType: "css")!
            var s:String = "<html><head><title></title><meta name=\"viewport\" content=\"initial-scale=1, user-scalable=no, width=device-width\" /><link rel=\"stylesheet\" href=\"./webview.css\" ></link></head><body>"+string+"</body></html>";
            var url:NSURL
    
            if baseURL == nil {
                url = NSBundle.mainBundle().bundleURL
            } else {
                url = baseURL
            }
    
            super.loadHTMLString(s, baseURL: url)
        }
    
        func webViewDidFinishLoad(webView: UIWebView) {
            self.webViewResizeToContent(webView)
        }
    
        func webViewResizeToContent(webView: UIWebView) {
            webView.layoutSubviews()
    
            // Set to smallest rect value
            var frame:CGRect = webView.frame
            frame.size.height = 1.0
            webView.frame = frame
    
            var height:CGFloat = webView.scrollView.contentSize.height
            println("UIWebView.height: \(height)")
    
            webView.setHeight(height: height)
            let heightConstraint = NSLayoutConstraint(item: webView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: 1.0, constant: height)
            webView.addConstraint(heightConstraint)
    
            // Set layout flag
            webView.window?.setNeedsUpdateConstraints()
            webView.window?.setNeedsLayout()
        }
    
    }
    
    0 讨论(0)
  • 2020-12-01 10:05

    This post has been updated for Swift 5 & WKWebView


    So this is a really great function you wrote there, OP!
    Here is just a shorter, more elegant version of your code:

    // make sure to declare the delegate when creating your webView (add UIWebViewDelegate to class declaration as well)
    myWebView.delegate = self
    
    func webViewDidFinishLoad(webView: UIWebView) {
         webView.frame.size.height = 1
         webView.frame.size = webView.sizeThatFits(CGSize.zero)
    }
    

    Migrating to WKWebView

    1) import WebKit
    2) make your ViewController inherit from WKNavigationDelegate
    3) hook up the WKWebView’s delegate: webView.navigationDelegate = self
    4) implement the following protocol function:

    webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
    

    After migrating from UIWebView to WKWebView, above approach doesn’t seem to work anymore.
    What you can do instead, is change the line with webView.sizeThatFits(CGSize.zero) to:

    webView.frame.size = webView.scrollView.contentSize
    

    The full code for WKWebView would then be:

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.frame.size.height = 1
        webView.frame.size = webView.scrollView.contentSize
    }
    
    0 讨论(0)
  • 2020-12-01 10:06

    I had problem with:

    let height = webView.scrollView.contentSize.height
    

    Sometimes my web view height simply didn't calculacte and stayed on default value. So finally I manage to find better solution that works fine, just replace that line code with:

    let height = webView.stringByEvaluatingJavaScript(from: "document.body.scrollHeight")
    

    This is mine final complete code:

        func webViewDidFinishLoad(_ webView: UIWebView) {
    
        //webview height
        webView.frame.size.height = 1
        webView.frame.size = webView.sizeThatFits(.zero)
        webView.scrollView.isScrollEnabled = false
        let height = webView.stringByEvaluatingJavaScript(from: "document.body.scrollHeight")
        if let height = height {
            if let heightInt = Int(height) {
                let heightFloat = Float(heightInt)
    
                webViewHeightConstraint.constant = CGFloat(heightFloat)
            }
        }
        webView.scalesPageToFit = true
    }
    
    0 讨论(0)
  • 2020-12-01 10:13

    Use the following code to make your UIWebView height dynamic in Swift 3.x

    func webViewDidFinishLoad(_ webView: UIWebView) {        
    
     let height = webView.scrollView.contentSize.height
     var wRect = webView.frame
     wRect.size.height = height
     webView.frame = wRect
    
    }
    
    0 讨论(0)
  • 2020-12-01 10:18

    Okay I figured out what I was doing wrong so now I know how to call this function. First of all I was supposed to call a UIWebViewDelegate in my class. Then set my var jobSkillView to (jobSkillView.delegate = self). Now this is where I made my major mistake. In my code I had a if else statement that I was throwing my func webViewDidLoad in. I was supposed to put it out of that statement and into the actual class to override my frame for the UIWebView. Speaking of frame **** DONT FORGET TO SET YOUR FRAME HEIGHT TO 1. Then and only then this function will work for your UIWebView. After that you should have a fully functional based height for your UIWebView for Swift.

    0 讨论(0)
提交回复
热议问题