Назад к вопросам
Junior
76
questionbank
Как получить изображение из галереи?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для получения изображения из галереи в iOS используется UIImagePickerController.
Ключевые шаги:
- Создать экземпляр
UIImagePickerController. - Установить
sourceTypeконтроллера на.photoLibrary. - Назначить делегат для
UIImagePickerController. Делегат должен соответствовать протоколамUIImagePickerControllerDelegateиUINavigationControllerDelegate. - Презентовать
UIImagePickerController. - В методе делегата
imagePickerController(_:didFinishPickingMediaWithInfo:)обработать выбранное изображение.
Пример реализации:
import UIKit
import PhotosUI // Для PHPickerViewController в iOS 14+
class YourViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// MARK: - Open Photo Library (Traditional)
func openPhotoLibraryTraditional() {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = false // Установить в true, если нужна возможность редактирования
self.present(imagePicker, animated: true, completion: nil)
} else {
// Handle case where photo library is not available
print("Photo Library not available")
}
}
// MARK: - Open Photo Library (Modern - iOS 14+)
@available(iOS 14, *)
func openPhotoLibraryModern() {
var config = PHPickerConfiguration()
config.filter = .images // Фильтр для выбора только изображений
config.selectionLimit = 1 // Установите количество выбираемых элементов
let picker = PHPickerViewController(configuration: config)
picker.delegate = self // Делегат для PHPickerViewController
self.present(picker, animated: true, completion: nil)
}
// MARK: - UIImagePickerControllerDelegate Methods
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let pickedImage = info[.originalImage] as? UIImage {
// Здесь вы можете использовать выбранное изображение (pickedImage)
print("Image selected: \(pickedImage.size)")
// Например, присвоить его UIImageView или сохранить
// self.imageView.image = pickedImage
}
picker.dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
// MARK: - PHPickerViewControllerDelegate (iOS 14+)
@available(iOS 14, *)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true) // Закрываем пикер независимо от выбора
guard !results.isEmpty else {
return // Ничего не выбрано
}
let itemProvider = results[0].itemProvider // Обрабатываем первый выбранный элемент (если selectionLimit = 1)
if itemProvider.canLoadObject(ofClass: UIImage.self) {
itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
if let error = error {
print("Error loading image: \(error.localizedDescription)")
return
}
if let selectedImage = image as? UIImage {
DispatchQueue.main.async {
// Здесь вы можете использовать выбранное изображение (selectedImage)
print("Modern picker image selected: \(selectedImage.size)")
// self.imageView.image = selectedImage
}
}
}
}
}
}
Использование PHPickerViewController (доступен с iOS 14) является более современным и предпочтительным способом, так как он обеспечивает больший контроль над выбором и конфиденциальностью пользователя.
Не забудьте добавить описание использования библиотеки фотографий в файл Info.plist приложения:
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to your photo library to select images.</string>
(для UIImagePickerController)
<!-- Для PHPickerViewController не требуется отдельного ключа доступа к библиотеке -->