5
5
// Created by Innei on 2025/2/7.
6
6
//
7
7
8
- import ObjectiveC
9
8
import QuickLook
9
+ import SDWebImage
10
10
import UIKit
11
11
12
- class PreviewControllerClass : NSObject , QLPreviewControllerDataSource , QLPreviewControllerDelegate {
13
- private var imageDataArray : [ Data ] = [ ]
12
+ private let previewContentDirectory = URL ( fileURLWithPath: NSTemporaryDirectory ( ) )
13
+ . appendingPathComponent ( Bundle . main. bundleIdentifier!)
14
+ . appendingPathComponent ( " image-preview " )
14
15
15
- init ( images: [ Data ] ) {
16
- self . imageDataArray = images
17
- super. init ( )
18
- }
16
+ class PreviewControllerController : QLPreviewController , QLPreviewControllerDataSource ,
17
+ QLPreviewControllerDelegate
18
+ {
19
+ private var imageDataArray : [ Data ] = [ ]
20
+ private var initialIndex : Int = 0
19
21
20
22
func numberOfPreviewItems( in controller: QLPreviewController ) -> Int {
21
23
return imageDataArray. count
22
24
}
23
25
26
+ func prepareImages( _ images: [ Data ] , initialIndex: Int = 0 ) {
27
+ self . imageDataArray = images
28
+ self . initialIndex = initialIndex
29
+ }
30
+
24
31
func previewController( _ controller: QLPreviewController , previewItemAt index: Int )
25
32
-> QLPreviewItem
26
33
{
27
- let tempURL = FileManager . default. temporaryDirectory. appendingPathComponent (
28
- " preview_image_ \( index) .jpg " )
29
- try ? imageDataArray [ index] . write ( to: tempURL)
30
- return tempURL as QLPreviewItem
34
+ let imageData = imageDataArray [ index]
35
+ guard let image = UIImage ( data: imageData) else {
36
+ return previewContentDirectory as QLPreviewItem
37
+ }
38
+ try ? FileManager . default. createDirectory (
39
+ at: previewContentDirectory, withIntermediateDirectories: true )
40
+
41
+ let tempLocation =
42
+ previewContentDirectory
43
+ . appendingPathComponent ( UUID ( ) . uuidString)
44
+ . appendingPathExtension ( image. sd_imageFormat. possiblePathExtension)
45
+
46
+ try ? imageData. write ( to: tempLocation)
47
+ return tempLocation as QLPreviewItem
31
48
}
32
49
33
- private func cleanupTempFiles( ) {
34
- for index in 0 ..< imageDataArray. count {
35
- let tempURL = FileManager . default. temporaryDirectory. appendingPathComponent (
36
- " preview_image_ \( index) .jpg " )
37
- try ? FileManager . default. removeItem ( at: tempURL)
50
+ override func viewDidLoad( ) {
51
+ debugPrint ( previewContentDirectory, " previewContentDirectory " )
52
+
53
+ super. viewDidLoad ( )
54
+ delegate = self
55
+ dataSource = self
56
+ view. tintColor = Utils . accentColor
57
+
58
+ // Set initial preview index
59
+ if initialIndex < imageDataArray. count {
60
+ self . currentPreviewItemIndex = initialIndex
38
61
}
39
62
}
40
63
64
+ private func cleanupTempFiles( ) {
65
+ try ? FileManager . default. removeItem ( at: previewContentDirectory)
66
+ }
67
+
41
68
func previewControllerDidDismiss( _ controller: QLPreviewController ) {
42
69
cleanupTempFiles ( )
43
70
}
44
-
45
- }
46
71
72
+ deinit {
73
+ self . cleanupTempFiles ( )
74
+ }
75
+
76
+ }
47
77
48
78
class ImagePreview : NSObject {
49
- public static func quickLookImage( _ images: [ Data ] ) {
79
+ public static func quickLookImage( _ images: [ Data ] , index : Int = 0 ) {
50
80
guard let rootViewController = UIApplication . shared. keyWindow? . rootViewController else {
51
81
return
52
82
}
@@ -55,12 +85,28 @@ class ImagePreview: NSObject {
55
85
print ( " no preview data " )
56
86
return
57
87
}
58
- let previewController = QLPreviewController ( )
59
- let previewControllerClass = PreviewControllerClass ( images: images)
60
- previewController. view. tintColor = Utils . accentColor
61
- previewController. dataSource = previewControllerClass
62
- previewController. delegate = previewControllerClass
88
+
89
+ let previewController = PreviewControllerController ( )
90
+ previewController. prepareImages ( images, initialIndex: index)
63
91
64
92
rootViewController. present ( previewController, animated: true )
65
93
}
66
94
}
95
+
96
+ extension SDImageFormat {
97
+ var possiblePathExtension : String {
98
+ switch self {
99
+ case . undefined: " "
100
+ case . JPEG: " jpg "
101
+ case . PNG: " png "
102
+ case . GIF: " gif "
103
+ case . TIFF: " tiff "
104
+ case . webP: " webp "
105
+ case . HEIC: " heic "
106
+ case . HEIF: " heif "
107
+ case . PDF: " pdf "
108
+ case . SVG: " svg "
109
+ default : " png "
110
+ }
111
+ }
112
+ }
0 commit comments