WKWebviewとは
UIWebviewよりも処理が高速かつ、JSのレンダリング周りの処理が安定している。
iOS8以降から使用可能。
googleChromeのiOSアプリもWKWebviewを使用している
Appleの公式ドキュメントにも
For new development, employ this class instead of the older UIWebView class.
とあるので、デフォでこのClassを使う。
1. 宣言
WKWebViewのインスタンスを作成します。
WKWebViewのデリゲートを指定
※ WKNavigationDelegateのプロトコルをClassに指定することを忘れないように
class WebViewController: UIViewController, WKNavigationDelegate {
・
・
webview = WKWebView()
webview.navigationDelegate = self
webview.translatesAutoresizingMaskIntoConstraints = false
2. レイアウト
StoryBoard上ではWKWebviewを配置できないので、
コードでAutoLayoutの制約を付ける必要があります。
※ NSLayoutAnchor(iOS9以降)を使うとAutoLayoutの記述をCSSライクに簡単に書けます
containerView.addSubview(webview!)
// 上辺の制約
webview.topAnchor.constraintEqualToAnchor(containerView.topAnchor, constant: 0.0).active = true
// 下辺の制約
webview.bottomAnchor.constraintEqualToAnchor(containerView.bottomAnchor, constant: 0.0).active = true
// 左辺の制約
webview.leadingAnchor.constraintEqualToAnchor(containerView.leadingAnchor, constant: 0.0).active = true
// 右辺の制約
webview.trailingAnchor.constraintEqualToAnchor(containerView.trailingAnchor, constant: 0.0).active = true
スワイプで戻る・進む
webview.allowsBackForwardNavigationGestures = true
にすると、スワイプ操作ができるようになります
2. webサイトの表示
loadReqestメソッドでページを表示
let request = NSURLRequest(URL: url!)
webview.loadRequest(request)
3. ナビゲーションの設置
戻る・進むボタンの設置の仕方ですが、ここは以前のUIWebVIewと一緒です。
ToolbarをStoryBoardで設置し、今回はコードでボタンを配置しました。
func creatToolbarItems() {
let backBtnImage = UIImage(named: "back")
let fowardBtnImage = UIImage(named: "next")
let flexbleItem = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
// 戻る・進む・リロードボタンの設置
goBackBtn = UIBarButtonItem(image: backBtnImage, style: .Plain, target: self, action: #selector(goBack))
goFowardBtn = UIBarButtonItem(image: fowardBtnImage, style: .Plain, target: self, action: #selector(goFoward))
refreshBtn = UIBarButtonItem(barButtonSystemItem: .Refresh, target: self, action: #selector(refresh))
toolbar.items = [goBackBtn, goFowardBtn, flexbleItem, refreshBtn]
}
4. デリゲート
WKNavigationのデリゲートメソッドを使用することで、
読み込み開始〜読み込み完了のタイミングのイベントを取得することができます。
よく使う例として、
ブラウザバックができるか判定して、backボタンのON,OFFを切り替える
処理は下記のようになります
// ページ読み込み完了時、呼ばれるメソッド
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
if webview.canGoBack {
goBackBtn.tintColor = nil
} else {
goBackBtn.tintColor = UIColor.grayColor()
}
}
注:target="_blank"なリンクがデフォルトだと開きません
下記のようにデリゲートメソッド内に
target="_blank"の場合の処理を記述
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
guard let url = navigationAction.request.URL else {
decisionHandler(.Cancel)
return
}
// target="_blank"の場合
if navigationAction.navigationType == WKNavigationType.LinkActivated {
if navigationAction.targetFrame == nil || !(navigationAction.targetFrame!.mainFrame) {
webview.loadRequest(NSURLRequest.init(URL: url))
decisionHandler(.Cancel)
return
}
}
decisionHandler(.Allow)
}
完成!
参考サイト
WKWebViewでtarget="_blank"なリンクが開かない時の対処法
http://qiita.com/ShingoFukuyama/items/b3a1441025a36ab7659c