Skip to content

Instantly share code, notes, and snippets.

@zachgibson
Last active June 11, 2022 18:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zachgibson/c71da6bf24f4ba32e8af1ab2b231a994 to your computer and use it in GitHub Desktop.
Save zachgibson/c71da6bf24f4ba32e8af1ab2b231a994 to your computer and use it in GitHub Desktop.
import PhotosUI
import SwiftUI
class ImageModel: ObservableObject {
enum ImageState {
case empty, loading(Progress), success(Image), failure(Error)
}
@Published private(set) var imageState: ImageState = .empty
@Published var imageSelection: PhotosPickerItem? {
didSet {
if let imageSelection {
let progress = loadTransferable(from: imageSelection)
imageState = .loading(progress)
} else {
imageState = .empty
}
}
}
private func loadTransferable(from imageSelection: PhotosPickerItem) -> Progress {
imageSelection.loadTransferable(type: Image.self) { result in
DispatchQueue.main.async {
guard imageSelection == self.imageSelection else { return }
print(imageSelection)
switch result {
case .success(let image?):
self.imageState = .success(image)
case .success(nil):
self.imageState = .empty
case .failure(let error):
self.imageState = .failure(error)
}
}
}
}
}
struct MyImage: View {
let imageState: ImageModel.ImageState
var body: some View {
switch imageState {
case .success(let image):
image.resizable().scaledToFill()
case .loading:
ProgressView()
case .empty:
Image(systemName: "person.crop.circle.badge.plus")
.font(.system(size: 40))
case .failure:
Image(systemName: "exclamationmark.triangle.fill")
.font(.system(size: 40))
}
}
}
struct EditableMyImage: View {
@ObservedObject var viewModel: ImageModel
var body: some View {
MyImage(imageState: viewModel.imageState)
}
}
struct ContentView: View {
@StateObject var viewModel = ImageModel()
var body: some View {
VStack {
PhotosPicker(selection: $viewModel.imageSelection, matching: .images) {
EditableMyImage(viewModel: viewModel)
.frame(width: 100, height: 100)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment