Appuyez sur le bouton pour afficher la photothèque. Sélectionnez une photo dans la photothèque pour l'afficher en plein écran.
Swift 5.3 Xcode 12.0.1 macOS 10.15.7
Définit une structure qui enveloppe la photothèque dans SwiftUI.
ImagePicker.swift
import SwiftUI
struct ImagePicker: UIViewControllerRepresentable {
var sourceType: UIImagePickerController.SourceType = .photoLibrary
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = false
imagePicker.sourceType = sourceType
return imagePicker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
}
}
Il s'agit de la structure d'écran de base de l'application. Affiche la photothèque au format feuille en fonction des variables d'état.
ContentView.swift
import SwiftUI
struct ContentView: View {
@State private var image = UIImage()
@State private var isShowPhotoLibrary = false
var body: some View {
VStack {
Image(uiImage: self.image)
Button(action: {
self.isShowPhotoLibrary = true
}, label: {
Text("Photo Library")
.padding()
})
}
.sheet(isPresented: $isShowPhotoLibrary, content: {
ImagePicker(sourceType: .photoLibrary)
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
«Respectez le protocole UIImagePickerControllerDelegate».
ImagePicker.swift
import SwiftUI
struct ImagePicker: UIViewControllerRepresentable {
// MARK: - Working with UIViewControllerRepresentable
var sourceType: UIImagePickerController.SourceType = .photoLibrary
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = false
imagePicker.sourceType = sourceType
imagePicker.delegate = context.coordinator // Coordinater to adopt UIImagePickerControllerDelegate Protcol.
return imagePicker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
}
// MARK: - Using Coordinator to Adopt the UIImagePickerControllerDelegate Protocol
@Binding var selectedImage: UIImage
@Environment(\.presentationMode) private var presentationMode
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: ImagePicker
init(_ parent: ImagePicker) {
self.parent = parent
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
parent.selectedImage = image
}
parent.presentationMode.wrappedValue.dismiss()
}
}
}
ʻAjoutez un modificateur à la vue Image. Réglez la photo sélectionnée sur la propriété ʻimage
au moment de la transition d'écran.
ContentView.swift
struct ContentView: View {
@State private var image = UIImage()
@State private var isShowPhotoLibrary = false
var body: some View {
VStack {
Image(uiImage: self.image)
.resizable()
.scaledToFill()
.frame(minWidth: 0, maxWidth: .infinity)
.edgesIgnoringSafeArea(.all)
Button(action: {
self.isShowPhotoLibrary = true
}, label: {
Text("Photo Library")
.padding()
})
}
.sheet(isPresented: $isShowPhotoLibrary, content: {
ImagePicker(sourceType: .photoLibrary, selectedImage: self.$image)
})
}
}
Recommended Posts