Назад к вопросам
Junior
76
questionbank

Как получить изображение из галереи?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Для получения изображения из галереи в iOS используется UIImagePickerController.

Ключевые шаги:

  1. Создать экземпляр UIImagePickerController.
  2. Установить sourceType контроллера на .photoLibrary.
  3. Назначить делегат для UIImagePickerController. Делегат должен соответствовать протоколам UIImagePickerControllerDelegate и UINavigationControllerDelegate.
  4. Презентовать UIImagePickerController.
  5. В методе делегата 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 не требуется отдельного ключа доступа к библиотеке -->