@@ -12,14 +12,14 @@ import SwiftUI
extension View {
// / P r e v i e w a m e d i a f i l e u s i n g a Q u i c k L o o k P r e v i e w C o n t r o l l e r . T h e p r e v i e w i s i n t e r a c t i v e w i t h
// / t h e d i s m i s s g e s t u r e w o r k i n g a s e x p e c t e d i f i t w a s p r e s e n t e d f r o m U I K i t .
func interactiveQuickLook ( item : Binding < MediaPreviewItem ? > , shouldHideControls : Bool = fals e) -> some View {
modifier ( InteractiveQuickLookModifier ( item : item , shouldHideControls : shouldHideControls ) )
func interactiveQuickLook ( item : Binding < MediaPreviewItem ? > , allowEditing : Bool = tru e) -> some View {
modifier ( InteractiveQuickLookModifier ( item : item , allowEditing : allowEditing ) )
}
}
private struct InteractiveQuickLookModifier : ViewModifier {
@ Binding var item : MediaPreviewItem ?
let shouldHideControls : Bool
let allowEditing : Bool
@ State private var dismissalPublisher = PassthroughSubject < Void , Never > ( )
@@ -27,7 +27,7 @@ private struct InteractiveQuickLookModifier: ViewModifier {
content . background {
if let item {
MediaPreviewViewController ( previewItem : item ,
shouldHideControls : shouldHideControls ,
allowEditing : allowEditing ,
dismissalPublisher : dismissalPublisher ) { self . item = nil }
} else {
// W o r k a r o u n d Q L P r e v i e w C o n t r o l l e r d i s m i s s a l i s s u e s , s e e b e l o w .
@@ -39,13 +39,13 @@ private struct InteractiveQuickLookModifier: ViewModifier {
private struct MediaPreviewViewController : UIViewControllerRepresentable {
let previewItem : MediaPreviewItem
let shouldHideControls : Bool
let allowEditing : Bool
let dismissalPublisher : PassthroughSubject < Void , Never >
let onDismiss : ( ) -> Void
func makeUIViewController ( context : Context ) -> PreviewHostingController {
PreviewHostingController ( previewItem : previewItem ,
shouldHideControls : shouldHideControls ,
allowEditing : allowEditing ,
dismissalPublisher : dismissalPublisher ,
onDismiss : onDismiss )
}
@@ -58,7 +58,7 @@ private struct MediaPreviewViewController: UIViewControllerRepresentable {
// / a n i m a t i o n s a n d i n t e r a c t i o n s w h i c h d o n ' t w o r k i f y o u r e p r e s e n t i t d i r e c t l y t o S w i f t U I 🤷 ♂ ️
class PreviewHostingController : UIViewController , QLPreviewControllerDataSource , QLPreviewControllerDelegate {
let previewItem : MediaPreviewItem
let shouldHideControls : Bool
let allowEditing : Bool
let onDismiss : ( ) -> Void
private var dismissalObserver : AnyCancellable ?
@@ -66,11 +66,11 @@ private struct MediaPreviewViewController: UIViewControllerRepresentable {
var previewController : QLPreviewController ?
init ( previewItem : MediaPreviewItem ,
shouldHideControls : Bool ,
allowEditing : Bool ,
dismissalPublisher : PassthroughSubject < Void , Never > ,
onDismiss : @ escaping ( ) -> Void ) {
self . previewItem = previewItem
self . shouldHideControls = shouldHideControls
self . allowEditing = allowEditing
self . onDismiss = onDismiss
super . init ( nibName : nil , bundle : nil )
@@ -100,7 +100,7 @@ private struct MediaPreviewViewController: UIViewControllerRepresentable {
guard self . previewController = = nil else { return }
let previewController = ( shouldHideControls ? NoControlsPreviewController ( ) : QLPreviewController ( ) )
let previewController = QLPreviewController ( )
previewController . dataSource = self
previewController . delegate = self
present ( previewController , animated : true )
@@ -120,6 +120,10 @@ private struct MediaPreviewViewController: UIViewControllerRepresentable {
// MARK: Q L P r e v i e w C o n t r o l l e r D e l e g a t e
func previewController ( _ controller : QLPreviewController , editingModeFor previewItem : QLPreviewItem ) -> QLPreviewItemEditingMode {
allowEditing ? . createCopy : . disabled
}
func previewControllerDidDismiss ( _ controller : QLPreviewController ) {
onDismiss ( )
}
@@ -139,28 +143,6 @@ class MediaPreviewItem: NSObject, QLPreviewItem {
}
}
private class NoControlsPreviewController : QLPreviewController {
override func viewDidLayoutSubviews ( ) {
super . viewDidLayoutSubviews ( )
guard let navigationController = children . first as ? UINavigationController else {
return
}
// R e m o v e t o p f i l e d e t a i l s b a r
navigationController . navigationBar . isHidden = true
// R e m o v e t h e t o o l b a r s a n d t h e i r b u t t o n s
navigationController . view . subviews . compactMap { $0 as ? UIToolbar } . forEach { toolbar in
toolbar . subviews . forEach { item in
item . isHidden = true
}
toolbar . isHidden = true
}
}
}
// MARK: - P r e v i e w s
struct PreviewView_Previews : PreviewProvider {
@@ -170,7 +152,7 @@ struct PreviewView_Previews: PreviewProvider {
static var previews : some View {
MediaPreviewViewController ( previewItem : previewItem ,
shouldHideControls : false ,
allowEditing : false ,
dismissalPublisher : . init ( ) ) { }
}
}