获取ios故事板WebView应用以在安全区域中呈现

问题描述

可能是一个简单的修复程序,但我试图将我的简单ios故事板应用程序呈现在iPhone 11的安全区域中。

当前占用了整个视图空间,并且没有使用安全区域。我不确定是否需要对代码进行任何更改,或者仅仅是在情节提要视图中未启用的设置。

这是我的第一个应用程序。感谢您的帮助。

import UIKit
import WebKit



class ViewController: UIViewController,WKUIDelegate {

    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let myURL = URL(string:"https://google.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)

        if #available(iOS 11.0,*) {
            webView.scrollView.contentInsetAdjustmentBehavior = .never;
        }

        webView.navigationDelegate = self
                webView.allowsBackForwardNavigationGestures = true

    }

    override func loadView() {

        let webConfiguration = WKWebViewConfiguration()
        webConfiguration.dataDetectorTypes = [.all]
        webView = WKWebView(frame: .zero,configuration: webConfiguration)


        
        webView.uiDelegate = self
        view = webView

    }

}

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView,decidePolicyFor navigationAction: WKNavigationAction,decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard
            let url = navigationAction.request.url else {
                decisionHandler(.cancel)
                return
        }

        let string = url.absoluteString
        if (string.contains("mailto:")) {
            UIApplication.shared.open(url,options: [:],completionHandler: nil)
            decisionHandler(.cancel)

            return
        }
        if (string.contains("sms:")) {
            UIApplication.shared.open(url,completionHandler: nil)
            decisionHandler(.cancel)

            return
        }
        decisionHandler(.allow)
    }
    
    

    
}


class FullScreenWKWebView: WKWebView {
    override var safeAreaInsets: UIEdgeInsets {
        return UIEdgeInsets(top: 100,left: 0,bottom: 0,right: 0)
    }
}
  1. enter image description here

解决方法

之所以会这样,是因为您将webView设置为控制器的视图。我认为最简单的方法是将webView设置为viewController主视图的子视图。首先将初始化代码从loadView方法移动到viewDidLoad,将webView添加为子视图,最后将webView锚点限制到safeArea锚点。

import UIKit
import WebKit

class ViewController: UIViewController,WKUIDelegate {

    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let webConfiguration = WKWebViewConfiguration()
        webConfiguration.dataDetectorTypes = [.all]
        webView = WKWebView(frame: .zero,configuration: webConfiguration)
        webView.uiDelegate = self
        
        webView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(webView)
        
        NSLayoutConstraint.activate([
            webView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),webView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
        ])
        
        let myURL = URL(string:"https://google.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)

        if #available(iOS 11.0,*) {
            webView.scrollView.contentInsetAdjustmentBehavior = .never;
        }

        webView.navigationDelegate = self
                webView.allowsBackForwardNavigationGestures = true

    }
}

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView,decidePolicyFor navigationAction: WKNavigationAction,decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard
            let url = navigationAction.request.url else {
                decisionHandler(.cancel)
                return
        }

        let string = url.absoluteString
        if (string.contains("mailto:")) {
            UIApplication.shared.open(url,options: [:],completionHandler: nil)
            decisionHandler(.cancel)

            return
        }
        if (string.contains("sms:")) {
            UIApplication.shared.open(url,completionHandler: nil)
            decisionHandler(.cancel)

            return
        }
        decisionHandler(.allow)
    }
}

如果先前的选项无效,则可以使用代码并使用viewSafeAreaInsetsDidChange方法更改webView边界,以使其知道安全区域插图。只需添加以下代码:

override func viewSafeAreaInsetsDidChange() {
    super.viewSafeAreaInsetsDidChange()
    view.bounds = view.safeAreaLayoutGuide.layoutFrame
}