WKWebViewを使ったWebView表示
swift4使用
また使いそうなのでメモ
storyboardは手を入れない。全部コードで。
リンク先は全部Safariに飛ばす
色々サイトを調べて作成。サイトのリンク消してしまった。
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)
}
}