Search code examples
iosswiftwkwebview

WKWebView bottom constraint set but doesn't work


I have set the WKWebView bottom constraint to super view but it won't display till super view instead displays content till safe area.

Here is the problem image that displays the bottom part doesn't fill properly.

enter image description here

And here is the hierarchy of view and constraints image

enter image description here

enter image description here

And code to setup WebView constraints with the container view

    let wv = WKWebView(frame: containerView.frame, configuration: wvConfig)
    webView = wv
    containerView.addSubview(wv)
    
    // setup constraints
    wv.translatesAutoresizingMaskIntoConstraints = false
    if #available(iOS 11.0, *) {
        wv.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
        wv.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
        wv.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
        wv.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
    } else {
        NSLayoutConstraint(item: wv, attribute: .top, relatedBy: .equal, toItem: containerView, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: wv, attribute: .leading, relatedBy: .equal, toItem: containerView, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: wv, attribute: .trailing, relatedBy: .equal, toItem: containerView, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: wv, attribute: .bottom, relatedBy: .equal, toItem: containerView, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
    } 

So, Can anyone rectify the issue here?

Some certain URL's works, but not for all. Why?


Solution

  • The following subclassed WKWebView might solve your problem:

    class FullScreenWKWebView: WKWebView {
    
        override var safeAreaInsets: UIEdgeInsets {
            if #available(iOS 11.0, *) {
                let insects = super.safeAreaInsets
                return UIEdgeInsets(top: insects.top, left: insects.left, bottom: 0, right: insects.right)
            } else {
                return .zero
            }
    
        }
        override var alignmentRectInsets: UIEdgeInsets{
            let insects = super.alignmentRectInsets
            return UIEdgeInsets(top: insects.top-20, left: insects.left, bottom: 0, right: insects.right)
        }
    }
    

    The above snipped taken from

    Full Code:

    import UIKit
    import WebKit
    class FullScreenWKWebView: WKWebView {
    
        override var safeAreaInsets: UIEdgeInsets {
            if #available(iOS 11.0, *) {
                let insects = super.safeAreaInsets
                return UIEdgeInsets(top: insects.top, left: insects.left, bottom: 0, right: insects.right)
            } else {
                return .zero
            }
    
        }
        override var alignmentRectInsets: UIEdgeInsets{
            let insects = super.alignmentRectInsets
            return UIEdgeInsets(top: insects.top-20, left: insects.left, bottom: 0, right: insects.right)
        }
    }
    class ViewController: UIViewController {
    
        let contaienrView: UIView = {
            let v = UIView()
            v.translatesAutoresizingMaskIntoConstraints = false
            return v
        }()
    
        let webView: FullScreenWKWebView = {
            let v = FullScreenWKWebView()
            v.translatesAutoresizingMaskIntoConstraints = false
            return v
        }()
    
        func setupViews(){
            view.addSubview(contaienrView)
            contaienrView.addSubview(webView)
            let constrains = [
                contaienrView.topAnchor.constraint(equalTo: view.topAnchor),
                contaienrView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                contaienrView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
                contaienrView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    
                webView.topAnchor.constraint(equalTo: contaienrView.topAnchor),
                webView.leadingAnchor.constraint(equalTo: contaienrView.leadingAnchor),
                webView.bottomAnchor.constraint(equalTo: contaienrView.bottomAnchor),
                webView.trailingAnchor.constraint(equalTo: contaienrView.trailingAnchor),
                ]
            NSLayoutConstraint.activate(constrains)
        }
    
        func loadRequest(){
            let url = URL(string: "https://afghan-gps.com/mobile")!
            let request = URLRequest(url: url)
            webView.load(request)
        }
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setupViews()
            loadRequest()
        }
    }
    

    output: 1. iOS version > 10 enter image description here

    1. iOS version <11 enter image description here