Read view link handling
This commit is contained in:
parent
b4d288bd29
commit
96255b2a1f
|
@ -8,6 +8,7 @@
|
||||||
import UIKit
|
import UIKit
|
||||||
import WebKit
|
import WebKit
|
||||||
import HTMLEntities
|
import HTMLEntities
|
||||||
|
import SafariServices
|
||||||
|
|
||||||
class ReadViewController: UIViewController {
|
class ReadViewController: UIViewController {
|
||||||
|
|
||||||
|
@ -50,6 +51,7 @@ class ReadViewController: UIViewController {
|
||||||
let webView = WKWebView()
|
let webView = WKWebView()
|
||||||
webView.translatesAutoresizingMaskIntoConstraints = false
|
webView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
webView.navigationDelegate = self
|
webView.navigationDelegate = self
|
||||||
|
webView.uiDelegate = self
|
||||||
if let content = itemContentHTML() {
|
if let content = itemContentHTML() {
|
||||||
// todo: using the bundle url is the only way to get the stylesheet to load, but feels wrong
|
// todo: using the bundle url is the only way to get the stylesheet to load, but feels wrong
|
||||||
// will break, e.g., images with relative urls
|
// will break, e.g., images with relative urls
|
||||||
|
@ -119,7 +121,40 @@ extension ReadViewController: WKNavigationDelegate {
|
||||||
let url = navigationAction.request.url!
|
let url = navigationAction.request.url!
|
||||||
if url == Bundle.main.bundleURL {
|
if url == Bundle.main.bundleURL {
|
||||||
return .allow
|
return .allow
|
||||||
|
} else {
|
||||||
|
present(SFSafariViewController(url: url), animated: true)
|
||||||
|
return .cancel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ReadViewController: WKUIDelegate {
|
||||||
|
func webView(_ webView: WKWebView, contextMenuConfigurationFor elementInfo: WKContextMenuElementInfo) async -> UIContextMenuConfiguration? {
|
||||||
|
guard let url = elementInfo.linkURL,
|
||||||
|
["http", "https"].contains(url.scheme?.lowercased()) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return UIContextMenuConfiguration(identifier: nil) {
|
||||||
|
SFSafariViewController(url: url)
|
||||||
|
} actionProvider: { _ in
|
||||||
|
return UIMenu(children: [
|
||||||
|
UIAction(title: "Open in Safari", image: UIImage(systemName: "safari"), handler: { [weak self] _ in
|
||||||
|
self?.present(SFSafariViewController(url: url), animated: true)
|
||||||
|
}),
|
||||||
|
UIAction(title: "Share", image: UIImage(systemName: "square.and.arrow.up"), handler: { [weak self] _ in
|
||||||
|
self?.present(UIActivityViewController(activityItems: [url], applicationActivities: nil), animated: true)
|
||||||
|
}),
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func webView(_ webView: WKWebView, contextMenuForElement elementInfo: WKContextMenuElementInfo, willCommitWithAnimator animator: UIContextMenuInteractionCommitAnimating) {
|
||||||
|
if let vc = animator.previewViewController as? SFSafariViewController {
|
||||||
|
animator.preferredCommitStyle = .pop
|
||||||
|
animator.addCompletion {
|
||||||
|
self.present(vc, animated: true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return .cancel
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue