102 lines
2.6 KiB
Swift
102 lines
2.6 KiB
Swift
import QuickLook
|
|
import SwiftUI
|
|
import UIKit
|
|
|
|
extension URL: Identifiable {
|
|
public var id: String {
|
|
absoluteString
|
|
}
|
|
}
|
|
|
|
struct QuickLookPreview: UIViewControllerRepresentable {
|
|
let selectedURL: URL
|
|
let urls: [URL]
|
|
|
|
func makeUIViewController(context _: Context) -> UIViewController {
|
|
AppQLPreviewController(selectedURL: selectedURL, urls: urls)
|
|
}
|
|
|
|
func updateUIViewController(
|
|
_: UIViewController, context _: Context
|
|
) {}
|
|
}
|
|
|
|
@MainActor
|
|
class AppQLPreviewController: UIViewController {
|
|
let selectedURL: URL
|
|
let urls: [URL]
|
|
|
|
var qlController: QLPreviewController?
|
|
|
|
init(selectedURL: URL, urls: [URL]) {
|
|
self.selectedURL = selectedURL
|
|
self.urls = urls
|
|
super.init(nibName: nil, bundle: nil)
|
|
}
|
|
|
|
@available(*, unavailable)
|
|
required init?(coder _: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
if qlController == nil {
|
|
qlController = QLPreviewController()
|
|
qlController?.dataSource = self
|
|
qlController?.delegate = self
|
|
qlController?.currentPreviewItemIndex = urls.firstIndex(of: selectedURL) ?? 0
|
|
present(qlController!, animated: true)
|
|
}
|
|
}
|
|
}
|
|
|
|
extension AppQLPreviewController: QLPreviewControllerDataSource {
|
|
nonisolated func numberOfPreviewItems(in _: QLPreviewController) -> Int {
|
|
urls.count
|
|
}
|
|
|
|
nonisolated func previewController(_: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
|
|
urls[index] as QLPreviewItem
|
|
}
|
|
}
|
|
|
|
extension AppQLPreviewController: QLPreviewControllerDelegate {
|
|
nonisolated func previewController(_: QLPreviewController, editingModeFor _: QLPreviewItem) -> QLPreviewItemEditingMode {
|
|
.createCopy
|
|
}
|
|
|
|
nonisolated func previewControllerWillDismiss(_: QLPreviewController) {
|
|
Task { @MainActor in
|
|
dismiss(animated: true)
|
|
}
|
|
}
|
|
|
|
nonisolated func previewControllerDidDismiss(_: QLPreviewController) {
|
|
Task { @MainActor in
|
|
dismiss(animated: true)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct TransparentBackground: UIViewControllerRepresentable {
|
|
public func makeUIViewController(context _: Context) -> UIViewController {
|
|
TransparentController()
|
|
}
|
|
|
|
public func updateUIViewController(_: UIViewController, context _: Context) {}
|
|
|
|
class TransparentController: UIViewController {
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
view.backgroundColor = .clear
|
|
}
|
|
|
|
override func willMove(toParent parent: UIViewController?) {
|
|
super.willMove(toParent: parent)
|
|
parent?.view?.backgroundColor = .clear
|
|
parent?.modalPresentationStyle = .overCurrentContext
|
|
}
|
|
}
|
|
}
|