Swift WKWebView 以编程方式
Posted
技术标签:
【中文标题】Swift WKWebView 以编程方式【英文标题】:Swift WKWebView programmatically 【发布时间】:2018-03-04 20:28:01 【问题描述】:我想以编程方式生成具有特定大小的 WKWebView。
这段代码是我目前得到的:
override func viewWillAppear(_ animated: Bool)
let webview = WKWebView()
webview.frame = CGRect(width: UIScreen.main.bounds.width, height: 150) // not working
webview.load(URLRequest(url: (forResource: "index", withExtension: "html", subdirectory: "myfolder")! as URL) as URLRequest)
webview.uiDelegate = self
self.view.addSubview(webview)
但它似乎不是那样工作的。
错误:“无法将'(forResource: String, withExtension: String, subdirectory: String)'类型的值强制转换为'URL'类型”
任何帮助将不胜感激!
【问题讨论】:
如果您能解释实际发生的事情与您预期会发生的事情,这将非常有帮助。 请不要不必要地使用NSURL
或NSURLRequest
。只需使用URL
和URLRequest
。
将“加载”行拆分为大约三到四行,每行只做一件事,您会受益匪浅。
【参考方案1】:
Swift 5.如下图创建一个WKWebView类型的var
private let webView = WKWebView(frame: .zero)
在 viewDidLoad() 方法中添加 webView 到 View。
webView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(self.webView)
// You can set constant space for Left, Right, Top and Bottom Anchors
NSLayoutConstraint.activate([
self.webView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
self.webView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
self.webView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
self.webView.topAnchor.constraint(equalTo: self.view.topAnchor),
])
// For constant height use the below constraint and set your height constant and remove either top or bottom constraint
//self.webView.heightAnchor.constraint(equalToConstant: 200.0),
self.view.setNeedsLayout()
var request = URLRequest(url: URL.init(string: "https://www.google.com"))
self.webView.load(request)
【讨论】:
【参考方案2】:我自己找到了解决方案:
这段代码运行良好:
let webview = WKWebView()
webview.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 100)
webview.load(URLRequest(url: Bundle.main.url(forResource: "index", withExtension:"html", subdirectory: "subdirectories")! as URL) as URLRequest)
self.view.addSubview(webview)
--
这是我遗漏的那一行:
url: Bundle.main.url(forResource: "index", withExtension:"html", subdirectory: "subdirectories")! as URL)
【讨论】:
【参考方案3】: let webConfiguration = WKWebViewConfiguration()
let startScript = Bundle(for: Background.self).url(forResource: "my_js_script", withExtension: "js")!
let scripts = do
return try String(contentsOf: startScript, encoding: .utf8)
catch
let message = "Could not load file at: \(startScript)"
fatalError(message)
let script = WKUserScript(source: scripts, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true)
let contentController: WKUserContentController = WKUserContentController()
contentController.addUserScript(script)
contentController.add(self, name: "backgroundListener")
webConfiguration.userContentController = contentController
self._webView = WKWebView(frame: .zero, configuration: webConfiguration)
self._webView!.customUserAgent = "my-Bridge"
let html : String = """
<html>
<head></head>
<body></body>
</html>
""";
self._webView!.loadHTMLString(html, baseURL: nil)
【讨论】:
您能否在此答案中添加一些描述,以便为该编码解决方案添加一些上下文?以上是关于Swift WKWebView 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章
使用 Javascript 处理 HTML 和 Swift 之间的交互
Swift 3,iOS 10 - 以编程方式声明 UIStackView 不适合屏幕宽度
以编程方式启用/禁用捏合以放大 WKWebView 和 viewForZoomingInScrollView
WKWebview & UIImageView 在 UIScrollView 内以编程方式自动布局 Objective-C