XCode 6 ベータ版の IB オブジェクト テンプレートは、まだ古いスタイルのオブジェクト (iOS の UIWebView と OSX の WebView) を作成しているようです。Apple が最新の WebKit 用に更新してくれることを願っていますが、それまでは、Interface Builder で WKWebViews を作成する最良の方法は何ですか? 基本ビュー (UIView または NSView) を作成し、そのタイプを WKWebView に割り当てる必要がありますか? オンラインで見つけたほとんどの例では、プログラムでコンテナ ビューに追加しています。なぜかそのほうがいい?
12 に答える
一部の人が指摘しているように、Xcode 6.4 の時点では、WKWebView は Interface Builder ではまだ利用できません。ただし、コードを使用してそれらを追加するのは非常に簡単です。
私はこれをViewControllerで使用しています。インターフェイス ビルダーのスキップ
import UIKit
import WebKit
class ViewController: UIViewController {
private var webView: WKWebView?
override func loadView() {
webView = WKWebView()
//If you want to implement the delegate
//webView?.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
if let url = URL(string: "https://google.com") {
let req = URLRequest(url: url)
webView?.load(req)
}
}
}
Info.plist
Info.plist トランスポート セキュリティ設定を追加します
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Xcode 9.1+
インターフェイス ビルダーの使用
オブジェクト ライブラリで WKWebView 要素を見つけることができます。
Swift 5を使用してプログラムでビューを追加する
let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
Swift 5を使用してプログラムでビューを追加する(完全なサンプル)
import UIKit
import WebKit
class ViewController: UIViewController {
private weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
initWebView()
webView.loadPage(address: "http://apple.com")
}
private func initWebView() {
let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
view.addSubview(webView)
self.webView = webView
webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
}
}
extension WKWebView {
func loadPage(address url: URL) { load(URLRequest(url: url)) }
func loadPage(address urlString: String) {
guard let url = URL(string: urlString) else { return }
loadPage(address: url)
}
}
Xcode 8 ではこれが可能になりましたが、それを達成する手段は控えめに言っても少しハックです。でもねえ、実用的なソリューションは実用的なソリューションですよね? 説明させてください。
WKWebView の initWithCoder: は、"NS_UNAVAILABLE" という注釈が付けられなくなりました。現在、下図のようになっています。
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
WKWebView をサブクラス化することから始めて、initWithCoder をオーバーライドします。スーパー initWithCoder を呼び出す代わりに、initWithFrame:configuration: などの別の init メソッドを使用する必要があります。以下の簡単な例。
- (instancetype)initWithCoder:(NSCoder *)coder
{
// An initial frame for initialization must be set, but it will be overridden
// below by the autolayout constraints set in interface builder.
CGRect frame = [[UIScreen mainScreen] bounds];
WKWebViewConfiguration *myConfiguration = [WKWebViewConfiguration new];
// Set any configuration parameters here, e.g.
// myConfiguration.dataDetectorTypes = WKDataDetectorTypeAll;
self = [super initWithFrame:frame configuration:myConfiguration];
// Apply constraints from interface builder.
self.translatesAutoresizingMaskIntoConstraints = NO;
return self;
}
Storyboard で、UIView を使用して、新しいサブクラスのカスタム クラスを指定します。残りは通常どおりです (自動レイアウト制約の設定、ビューをコントローラーのアウトレットにリンクするなど)。
最後に、WKWebView は UIWebView とは異なる方法でコンテンツをスケーリングします。多くの人は、WKWebView がコンテンツをスケーリングして UIWebView と同じ倍率でレンダリングするのを抑制するの簡単なアドバイスに従い、 WKWebView がこの点で UIWebView の動作により厳密に従うようにしたいと思うでしょう。