import SwiftUI
import UIKit
struct PhotoPickerScreen: View {
@State private var image: Image? = nil
@State private var showCamera = false
@State private var showPhotoLibrary = false
@State private var inputImage: UIImage? = nil
var body: some View {
VStack {
HStack {
Button("Take Photo") {
showCamera = true
}
.disabled(!UIImagePickerController.isSourceTypeAvailable(.camera))
.padding()
Button("Gallery") {
showPhotoLibrary = true
}
.padding()
}
Spacer()
if let image = image {
image
.resizable()
.scaledToFit()
.frame(maxWidth: 300, maxHeight: 300)
} else {
Text("No photo selected")
.foregroundColor(.gray)
}
Spacer()
}
.sheet(isPresented: $showCamera) {
ImagePicker(sourceType: .camera, selectedImage: $inputImage)
}
.sheet(isPresented: $showPhotoLibrary) {
ImagePicker(sourceType: .photoLibrary, selectedImage: $inputImage)
}
.onChange(of: inputImage) { _ in loadImage() }
}
func loadImage() {
guard let inputImage = inputImage else { return }
image = Image(uiImage: inputImage)
}
}
struct ImagePicker: UIViewControllerRepresentable {
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
let parent: ImagePicker
init(_ parent: ImagePicker) {
self.parent = parent
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let uiImage = info[.originalImage] as? UIImage {
parent.selectedImage = uiImage
}
picker.dismiss(animated: true)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true)
}
}
var sourceType: UIImagePickerController.SourceType
@Binding var selectedImage: UIImage?
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
picker.sourceType = sourceType
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
}
struct PhotoPickerScreen_Previews: PreviewProvider {
static var previews: some View {
PhotoPickerScreen()
}
}This solution uses SwiftUI with a UIViewControllerRepresentable wrapper called ImagePicker to access the camera and photo library.
Two buttons let the user choose between taking a photo or picking from the gallery. The 'Take Photo' button is disabled if the device has no camera.
When a photo is selected or taken, it updates the inputImage state, which triggers loadImage() to convert it to a SwiftUI Image and display it.
The ImagePicker uses UIKit's UIImagePickerController to handle the camera and photo library, with a coordinator to manage delegate callbacks.
This approach handles permissions automatically by the system when accessing camera or photo library.