Preview documents, images, audio, and 3D USDZ files with QLPreviewController and SwiftUI .quickLookPreview, and generate asynchronous thumbnails using QLThumbnailGenerator in iOS apps.
82%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Preview documents, media, and 3D models with QLPreviewController and generate fast, cached file thumbnails with QLThumbnailGenerator in iOS and iPadOS.
The .quickLookPreview modifier presents system file previews directly from SwiftUI when binding to an optional local URL.
import SwiftUI
import QuickLook
struct DocumentRowView: View {
let fileURL: URL
@State private var previewURL: URL?
var body: some View {
HStack {
Image(systemName: "doc.fill")
Text(fileURL.lastPathComponent)
Spacer()
Button("Preview") {
previewURL = fileURL
}
}
.quickLookPreview($previewURL)
}
}For multi-item carousels, custom navigation transitions, or fine-grained preview control, use QLPreviewController.
import UIKit
import QuickLook
@MainActor
final class DocumentPreviewCoordinator: NSObject, QLPreviewControllerDataSource, QLPreviewControllerDelegate {
private var previewItems: [URL] = []
func presentPreview(from presenter: UIViewController, files: [URL], startIndex: Int = 0) {
self.previewItems = files
let previewController = QLPreviewController()
previewController.dataSource = self
previewController.delegate = self
previewController.currentPreviewItemIndex = startIndex
presenter.present(previewController, animated: true)
}
// MARK: - QLPreviewControllerDataSource
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
previewItems.count
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> any QLPreviewItem {
previewItems[index] as NSURL
}
}Generate asynchronous, system-cached thumbnails for documents, images, and videos with QLThumbnailGenerator.Request.
import QuickLookThumbnailing
import UIKit
actor ThumbnailLoader {
static let shared = ThumbnailLoader()
private let cache = NSCache<NSURL, UIImage>()
func loadThumbnail(for fileURL: URL, size: CGSize, scale: CGFloat = 2.0) async throws -> UIImage {
if let cached = cache.object(forKey: fileURL as NSURL) {
return cached
}
let request = QLThumbnailGenerator.Request(
fileAt: fileURL,
size: size,
scale: scale,
representationTypes: .all
)
let representation = try await QLThumbnailGenerator.shared.generateBestRepresentation(for: request)
let image = representation.uiImage
cache.setObject(image, forKey: fileURL as NSURL)
return image
}
}Provide custom titles or encrypted/in-memory file references wrapped in local sandbox files:
import QuickLook
final class PreviewableDocument: NSObject, QLPreviewItem {
let previewItemURL: URL?
let previewItemTitle: String?
init(url: URL, title: String? = nil) {
self.previewItemURL = url
self.previewItemTitle = title ?? url.lastPathComponent
super.init()
}
}1.0 produces blurry thumbnails on Retina displays; always pass environment @Environment(\.displayScale) or traitCollection.displayScale.generateBestRepresentation(for:) or callbacks..quickLookPreview($url) used for standard SwiftUI single-file previewing?QLPreviewControllerDataSource return valid QLPreviewItem conforming objects?QLThumbnailGenerator.Request pass appropriate size, screen scale, and representation types?NSCache to prevent redundant disk decodes?thienqo/ios-skills
6bf8b62
Also appears in
since Sep 6, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.