在 WKWebView 下载文档和加载图像(png、jpeg)、pdf、doc 等 swift
Download document & Load Image(png, jpeg), pdf, doc, etc in WKWebView swift
我正在使用 Alamofire 从 url 下载文档,文档可以是图像、pdf 或 doc 等。
以下代码用于使用Alamofire下载并保存在文档目录中并在webview中加载。
func saveToDocumentDirectory(BillUrl: String) {
let manager = Alamofire.Session.default
let fileName = (BillUrl.components(separatedBy: "/").last) ?? ""
MBProgressHUD.showAdded(to: self.view, animated: true)
let destinationPath: DownloadRequest.Destination = { _, _ in
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0];
let fileURL = documentsURL.appendingPathComponent(fileName)
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
manager.download(BillUrl, method: .get, parameters: nil, headers: nil, to: destinationPath)
.downloadProgress { (progress) in
print("Temporary URL: ")
print(progress.fractionCompleted)
}
.response { response in
switch response.result {
case .success(let pathUrl) :
MBProgressHUD.hide(for: self.view, animated: true)
print(pathUrl as Any) //pathUrl = file:///var/mobile/Containers/Data/Application/C651C521-31A7-4512-A393-6A94442472A0/Documents/1_DlatFlsbZ1fJSs-_aIJmlg_1588075057_13.png
self.displayAlert(path: pathUrl ?? URL(string: "")!)
case .failure(let error) :
MBProgressHUD.hide(for: self.view, animated: true)
print(error)
self.alert(message: "Something went wrong while proccessing your request", title: "Alert!")
}
}
}
fileprivate func displayAlert(path: URL) {
let alertController = UIAlertController(title: "Alert!", message: "file downloaded at \(path)", preferredStyle: .alert)
let OKAction = UIAlertAction(title: "OK", style: .default, handler: { action in
let webViewVC = storyBoard.instantiateViewController(withIdentifier: "WebViewVC") as! WebViewVC
webViewVC.webUrl = path
self.navigationController?.pushViewController(webViewVC, animated: true)
})
alertController.addAction(OKAction)
self.present(alertController, animated: true, completion: nil)
}
下面是 webview 的代码 class
class WebViewVC: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
var webUrl = URL(string: "")
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.isHidden = false
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
webView.allowsBackForwardNavigationGestures = true
webView.autoresizesSubviews = true
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
webView.load(URLRequest(url: webUrl!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 600.0))
}
override func viewDidLayoutSubviews() {
webView.frame = CGRect.init(x: 0, y: 0, width: self.view.frame.size.width , height: self.view.frame.size.height)
view = webView
}
}
pdf 文件在 webview 中正确加载,但图像在 webview 中加载不正确,图像的顶部隐藏在导航栏后面。
我创建了 WKWebView 的出口并将其添加到 self.view.addSubview(webView)
但每次它在 webView = WKWebView(frame: .zero, configuration: webConfiguration)
崩溃
我不知道接下来要尝试什么。先感谢您。
我们可以通过设置框架来创建 WKWebView
,使其不与 UINavigationBar
重叠。
import UIKit
import WebKit
class SecondViewController: UIViewController,UIWebViewDelegate,UIScrollViewDelegate, WKUIDelegate {
var WKwebView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let userContentController: WKUserContentController = WKUserContentController()
let conf = WKWebViewConfiguration()
conf.userContentController = userContentController
WKwebView = WKWebView (frame: CGRect( x: 0, y: 60, width: self.view.frame.width, height: self.view.frame.height - 60 ), configuration: WKWebViewConfiguration())
WKwebView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
WKwebView.uiDelegate = self
WKwebView.scrollView.bounces = false
WKwebView.scrollView.delegate = self;
view.addSubview(WKwebView)
var request : URLRequest!
let LOGINURL = "https://i.stack.imgur.com/RRy76.png";
let url : URL = URL(string: LOGINURL as String)!
request = URLRequest (url: url);
WKwebView.load(request)
}
}
输出 : Output without overlapping
我正在使用 Alamofire 从 url 下载文档,文档可以是图像、pdf 或 doc 等。 以下代码用于使用Alamofire下载并保存在文档目录中并在webview中加载。
func saveToDocumentDirectory(BillUrl: String) {
let manager = Alamofire.Session.default
let fileName = (BillUrl.components(separatedBy: "/").last) ?? ""
MBProgressHUD.showAdded(to: self.view, animated: true)
let destinationPath: DownloadRequest.Destination = { _, _ in
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0];
let fileURL = documentsURL.appendingPathComponent(fileName)
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
manager.download(BillUrl, method: .get, parameters: nil, headers: nil, to: destinationPath)
.downloadProgress { (progress) in
print("Temporary URL: ")
print(progress.fractionCompleted)
}
.response { response in
switch response.result {
case .success(let pathUrl) :
MBProgressHUD.hide(for: self.view, animated: true)
print(pathUrl as Any) //pathUrl = file:///var/mobile/Containers/Data/Application/C651C521-31A7-4512-A393-6A94442472A0/Documents/1_DlatFlsbZ1fJSs-_aIJmlg_1588075057_13.png
self.displayAlert(path: pathUrl ?? URL(string: "")!)
case .failure(let error) :
MBProgressHUD.hide(for: self.view, animated: true)
print(error)
self.alert(message: "Something went wrong while proccessing your request", title: "Alert!")
}
}
}
fileprivate func displayAlert(path: URL) {
let alertController = UIAlertController(title: "Alert!", message: "file downloaded at \(path)", preferredStyle: .alert)
let OKAction = UIAlertAction(title: "OK", style: .default, handler: { action in
let webViewVC = storyBoard.instantiateViewController(withIdentifier: "WebViewVC") as! WebViewVC
webViewVC.webUrl = path
self.navigationController?.pushViewController(webViewVC, animated: true)
})
alertController.addAction(OKAction)
self.present(alertController, animated: true, completion: nil)
}
下面是 webview 的代码 class
class WebViewVC: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
var webUrl = URL(string: "")
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.isHidden = false
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
webView.allowsBackForwardNavigationGestures = true
webView.autoresizesSubviews = true
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
webView.load(URLRequest(url: webUrl!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 600.0))
}
override func viewDidLayoutSubviews() {
webView.frame = CGRect.init(x: 0, y: 0, width: self.view.frame.size.width , height: self.view.frame.size.height)
view = webView
}
}
pdf 文件在 webview 中正确加载,但图像在 webview 中加载不正确,图像的顶部隐藏在导航栏后面。
我创建了 WKWebView 的出口并将其添加到 self.view.addSubview(webView)
但每次它在 webView = WKWebView(frame: .zero, configuration: webConfiguration)
崩溃
我不知道接下来要尝试什么。先感谢您。
我们可以通过设置框架来创建 WKWebView
,使其不与 UINavigationBar
重叠。
import UIKit
import WebKit
class SecondViewController: UIViewController,UIWebViewDelegate,UIScrollViewDelegate, WKUIDelegate {
var WKwebView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let userContentController: WKUserContentController = WKUserContentController()
let conf = WKWebViewConfiguration()
conf.userContentController = userContentController
WKwebView = WKWebView (frame: CGRect( x: 0, y: 60, width: self.view.frame.width, height: self.view.frame.height - 60 ), configuration: WKWebViewConfiguration())
WKwebView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
WKwebView.uiDelegate = self
WKwebView.scrollView.bounces = false
WKwebView.scrollView.delegate = self;
view.addSubview(WKwebView)
var request : URLRequest!
let LOGINURL = "https://i.stack.imgur.com/RRy76.png";
let url : URL = URL(string: LOGINURL as String)!
request = URLRequest (url: url);
WKwebView.load(request)
}
}
输出 : Output without overlapping