now put thumbnails in the scrollbar
- ID
015884c- date
2023-06-08 07:52:45+00:00- author
Alex Chan <alex@alexwlchan.net>- parent
b7b2d78- message
now put thumbnails in the scrollbar- changed files
2 files, 54 additions, 14 deletions
Changed files
BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1859) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1838)
diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
index df0dbe0..3a61540 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -18,8 +18,8 @@ struct PhotoReviewer: View {
ScrollViewReader { proxy in
ScrollView(.horizontal) {
LazyHStack(spacing: 10) {
- ForEach(assets, id: \.localIdentifier) { photo in
- ThumbnailItem(label: "\(photo.localIdentifier)")
+ ForEach(assets, id: \.localIdentifier) { asset in
+ ThumbnailItem(asset: asset)
}
}.padding()
}.frame(height: 100)
BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift (513) → BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift (2010)
diff --git a/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift b/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
index f00eb8c..2febcd5 100644
--- a/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
@@ -6,23 +6,63 @@
//
import SwiftUI
+import Photos
+
+extension PHAsset {
+ func getThumbnail() -> NSImage {
+ // This implementation is based on code in a Stack Overflow answer
+ // by Francois Nadeau: https://stackoverflow.com/a/48755517/1558022
+
+ let options = PHImageRequestOptions()
+ options.isSynchronous = true
+
+ // If i don't set this value, then sometimes I get an error like
+ // this in the `info` variable:
+ //
+ // Error Domain=PHPhotosErrorDomain Code=3164 "(null)"
+ //
+ // This means that the asset is in the cloud, and by default Photos
+ // isn't allowed to download assets here. Apple's documentation
+ // suggests adding this option as the fix.
+ //
+ // See https://developer.apple.com/documentation/photokit/phphotoserror/phphotoserrornetworkaccessrequired
+ options.isNetworkAccessAllowed = true
+
+ var image = NSImage()
+
+ let start = DispatchTime.now()
+ var elapsed = start
+
+ func printElapsed(_ label: String) -> Void {
+ let now = DispatchTime.now()
+
+ let totalInterval = Double(now.uptimeNanoseconds - start.uptimeNanoseconds) / 1_000_000_000
+ let elapsedInterval = Double(now.uptimeNanoseconds - elapsed.uptimeNanoseconds) / 1_000_000_000
+
+ elapsed = DispatchTime.now()
+ }
+
+ PHCachingImageManager()
+ .requestImage(
+ for: self,
+ targetSize: CGSize(width: 50, height: 50),
+ contentMode: .aspectFit,
+ options: options,
+ resultHandler: { (result, info) -> Void in
+ image = result!
+ }
+ )
+
+ return image
+ }
+}
struct ThumbnailItem: View {
- @State var label: String
+ @State var asset: PHAsset
var body: some View {
ZStack {
- Circle()
- .fill(.yellow)
- .frame(width: 70, height: 70)
- Text(label)
- .font(.title)
+ Image(nsImage: asset.getThumbnail())
}
}
}
-
-struct ThumbnailItem_Previews: PreviewProvider {
- static var previews: some View {
- ThumbnailItem(label: "1")
- }
-}