[swift4]WKWebViewを使ったwebview

WKWebViewを使ったWebView表示

swift4使用

また使いそうなのでメモ

storyboardは手を入れない。全部コードで。
リンク先は全部Safariに飛ばす

色々サイトを調べて作成。サイトのリンク消してしまった。

```swift:ViewController.swift
import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    var webView: WKWebView!
    let firstViewUrl = "https://yahoo.co.jp"
    
    // toolBar設定
    var toolBar: UIToolbar?
    var rewindButton = UIBarButtonItem()
    var fastForwardButton = UIBarButtonItem()
    var refreshButton = UIBarButtonItem()
    var openInSafari = UIBarButtonItem()
    
    // portraitのみを想定
    var topPadding:CGFloat = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // インジケータ表示設定
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
        
        // ツールバー生成
        let width:CGFloat = view.frame.size.width
        let height:CGFloat = view.frame.size.height
        self.toolBar = self.createToolBar(frame: CGRect(x: 0, y: height-44, width: width, height: 40.0), position: CGPoint(x: width/2, y: height-20.0))

    }

    override func viewDidAppear(_ animated: Bool) {
        
        let screenWidth:CGFloat = view.frame.size.width
        let screenHeight:CGFloat = view.frame.size.height
        
        // iPhone X , X以外は0となる
        if #available(iOS 11.0, *) {
            let window = UIApplication.shared.keyWindow
            topPadding = window!.safeAreaInsets.top
        }
        
        // Webページの大きさを画面に合わせる
        let rect = CGRect(x: 0,
                          y: topPadding,
                          width: screenWidth,
                          height: screenHeight - topPadding)
        
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: rect, configuration: webConfiguration)
        webView.navigationDelegate = self
        webView.uiDelegate = self
        
        // スワイプで戻るを許可
        //webView.allowsBackForwardNavigationGestures = true
        
        let webUrl = URL(string: firstViewUrl)!
        let req = URLRequest(url: webUrl)
        webView.load(req)
        
        // インスタンスをビューに追加する
        self.view.addSubview(webView)
        
        // サブビューを追加する
        self.view.addSubview(self.toolBar!)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // WebView がコンテンツの読み込みを完了した後に呼ばれる
    func webViewDidFinishLoad(_ webView: UIWebView) {
        // インジケータを非表示にする
        UIApplication.shared.isNetworkActivityIndicatorVisible = false
        
        self.rewindButton.isEnabled = self.webView!.canGoBack
        self.fastForwardButton.isEnabled = self.webView!.canGoForward

    }
    
    // WKNavigationDelegate
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        
        // リンククリックは全部Safariに飛ばしたい
        if navigationAction.navigationType == WKNavigationType.linkActivated {
            UIApplication.shared.open(navigationAction.request.url!)
            decisionHandler(.cancel)
        } else {
            decisionHandler(.allow)
        }
    }
    
    // WKUIDelegate
    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        
        // リンククリックは全部Safariに飛ばしたい
        if navigationAction.navigationType == WKNavigationType.linkActivated {
            UIApplication.shared.open(navigationAction.request.url!)
        }
        
//        // target="_blank"なリンクが開かない時の対処
//        if navigationAction.targetFrame == nil {
//            webView.load(navigationAction.request)
//        }
        
        return nil
    }
    
    // Create ToolBar
    func createToolBar(frame: CGRect, position: CGPoint) -> UIToolbar {
        // UIWebViewのインスタンスを生成
        let _toolBar = UIToolbar()
        
        // ツールバーのサイズを決める
        _toolBar.frame = frame
        
        // ツールバーの位置を決める
        _toolBar.layer.position = position
        
        // 文字色を設定する
        _toolBar.tintColor = UIColor.black
        // 背景色を設定する
        _toolBar.backgroundColor = UIColor.white
        
        // 各ボタンを生成する
        let spacerEdge: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
        spacerEdge.width = 16
        let spacer: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
        spacer.width = 42
        self.rewindButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem(rawValue: 101)!, target: self, action: #selector(back))
        self.fastForwardButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem(rawValue: 102)!, target: self, action: #selector(forward))
        self.refreshButton = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(refresh))
        self.openInSafari = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(safari))
        let spacerRight: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        
        // ボタンをツールバーに入れる
        _toolBar.items = [spacerEdge, rewindButton, spacer, fastForwardButton, spacerRight, refreshButton, spacer, openInSafari, spacerEdge]
        
        return _toolBar
    }
    
    // 戻るボタンの処理
    @IBAction func back(_: AnyObject) {
        self.webView?.goBack()
    }
    
    // 進むボタンの処理
    @IBAction func forward(_: AnyObject) {
        self.webView?.goForward()
    }
    
    // 再読み込みボタンの処理
    @IBAction func refresh(_: AnyObject) {
        self.webView?.reload()
    }
    
    // safari で開く
    @IBAction func safari(_: AnyObject) {
        let url = self.webView?.url
        UIApplication.shared.open(url!, options: [:], completionHandler: nil)
    }
}

```