Swift UIImagePickerController проблема с фото в iCloud и позволяет редактировать - PullRequest
0 голосов
/ 14 июля 2020

Мне нужна помощь. Я использую UIImagePickerController для загрузки аватара. Я могу сделать снимок с камеры, а вы можете выбрать фотографию. У меня есть фотографии, частично хранящиеся в iCloud, и только предварительные просмотры на устройстве, частично локально. Выбирая локальную фотографию или с камеры, попадаем на экран выбора области, обрезки изображения. Итак, если фотография хранится в iCloud, то происходит следующее:

Я выбираю фотографию, нажимаю готово - окно закрывается, но фотографии нет.

Мой код:

Код для выбора фото из библиотеки

func openMediaDialog() {
    
        PHPhotoLibrary.requestAuthorization({status in
                if status == .authorized{
                    DispatchQueue.main.async {
                        self.imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
                        //self.imagePicker.navigationItem.setHidesBackButton(false, animated: false)
                        //If you dont want to edit the photo then you can set allowsEditing to false
                        self.imagePicker.allowsEditing = true
                        self.imagePicker.delegate = self
                        self.present(self.imagePicker, animated: true, completion: nil)
                    }
                    
                } else if status == .denied {
                
                    self.alertCameraAccessNeeded(title: "Необходим доступ к фото!", message: "Для загрузки аватара необходим доступ к фото. Разрешить?")
                }
        })
    
    
}

ДЕЛЕГАТ:

override func imagePickerController(_ picker: UIImagePickerController,
                           didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    /*
     Get the image from the info dictionary.
     If no need to edit the photo, use `UIImagePickerControllerOriginalImage`
     instead of `UIImagePickerControllerEditedImage`
     */
    
    guard let selectedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        self.view.makeToast("Проблема с выбором изображения")
        
    }
    
    
    
    print(selectedImage)
....

СЛЕДУЮЩИЙ ШАГ - ЗАГРУЗИТЬ ИЗОБРАЖЕНИЕ

Прошу подсказать, как убедиться что фотографии загружаются из icloud, при необходимости кадрируются и загружаются на сервер по обычному сценарию.

1 Ответ

0 голосов
/ 14 июля 2020

Вы получите PHAsset, если ваши фотографии в iCloud .. используйте эту функцию для получения фотографий

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // it will be loaded asynchronously
        loadImageFromPicker(info: info)
        picker.dismiss(animated: true, completion: nil)
        self.presentingViewController?.dismiss(animated: true, completion: nil)
    }

    private func loadImageFromPicker(info: [UIImagePickerController.InfoKey : Any]) {
        guard let phAsset = info[.phAsset] as? PHAsset else {
            return
        }
       
        // size doesn't matter, because resizeMode = .none
        let size = CGSize(width: 32, height: 32)
        let options = PHImageRequestOptions()
        options.version = .original
        options.deliveryMode = .highQualityFormat
        options.resizeMode = .none
        options.isNetworkAccessAllowed = true
        PHImageManager.default().requestImage(for: phAsset, targetSize: size, contentMode: .aspectFit, options: options) { [weak self] (image, info) in
            if let s = self, let image = image {
                // use this image
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...