programing

인터페이스 빌더의 WKWebView

nasanasas 2020. 8. 28. 07:34
반응형

인터페이스 빌더의 WKWebView


XCode 6 베타의 IB 개체 템플릿은 여전히 ​​구식 개체 (iOS 용 UIWebView 및 OSX 용 WebView)를 만들고있는 것 같습니다. 바라건대 Apple은 최신 WebKit에 맞게 업데이트 할 것이지만 그때까지 Interface Builder에서 WKWebView를 만드는 가장 좋은 방법은 무엇입니까? 기본보기 (UIView 또는 NSView)를 생성하고 WKWebView에 해당 유형을 할당해야합니까? 온라인에서 찾은 대부분의 예제는 프로그래밍 방식으로 컨테이너 뷰에 추가합니다. 어떤 이유로 더 나은가요?


맞습니다-작동하지 않는 것 같습니다. 헤더를 보면 다음이 표시됩니다.

- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;

이는 펜촉에서 인스턴스화 할 수 없음을 의미합니다.

viewDidLoad 또는 loadView에서 수동으로해야합니다.


일부 사람들이 지적했듯이 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를 재정의합니다. super 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;
}

Over in your Storyboard, use a UIView and give it a custom class of your new subclass. The rest is business as usual (setting auto-layout constraints, linking the view to an outlet in a controller, etc).

Finally, WKWebView scales content differently to UIWebView. Many people are likely going to want to follow the simple advice in Suppress WKWebView from scaling content to render at same magnification as UIWebView does to make WKWebView more closely follow the UIWebView behaviour in this regard.


Here's a simple Swift 3 version based on crx_au's excellent answer.

import WebKit

class WKWebView_IBWrapper: WKWebView {
    required convenience init?(coder: NSCoder) {
        let config = WKWebViewConfiguration()
        //config.suppressesIncrementalRendering = true //any custom config you want to add
        self.init(frame: .zero, configuration: config)
        self.translatesAutoresizingMaskIntoConstraints = false
    }
}

Create a UIView in Interface Builder, assign your constraints, and assign it WKWebView_IBWrapper as a custom class, like so:

유틸리티-> 신원 검사기 탭 [1]


This is now apparently fixed in Xcode 9b4. The release notes say "WKWebView is available in the iOS object library."

I haven't looked deeper to see if it requires iOS 11 or is backward compatible yet.


If you still face this issue in recent versions of Xcode, i.e. v9.2+, simply import Webkit to you ViewController:

#import <WebKit/WebKit.h>
  1. Before the fix: 여기에 이미지 설명 입력

  2. After the fix:

여기에 이미지 설명 입력


You can instantiate and configure a WKWebView in IB since Xcode 9, no need to do it in code. 여기에 이미지 설명 입력

Note that your deployment target has to be higher than iOS 10 though or you will get a compile-time error.

여기에 이미지 설명 입력


In XCode Version 9.0.1 WKWebView is available on Interface Builder.


I've linked WebKit, now it's working!

예


This worked for me in Xcode 7.2...

First add the web view as a UIWebView outlet in the storyboard / IB. This will give you a property like this:

@property (weak, nonatomic) IBOutlet UIWebView *webView;

그런 다음 코드를 편집하여 WKWebView로 변경하십시오.

@property (weak, nonatomic) IBOutlet WKWebView *webView;

또한 Identity inspector에서 사용자 정의 클래스를 WKWebView로 변경해야합니다.

참고 URL : https://stackoverflow.com/questions/24167812/wkwebview-in-interface-builder

반응형