Использование PHPickerViewController для передачи фотографий в представление коллекции

Я пытаюсь использовать PHPickerViewController для получения фотографий из средства выбора и добавления их в представление коллекции. Поскольку PHPickerViewController настолько новый, я нахожу очень ограниченную информацию о нем. Я предполагаю, что мне придется преобразовать его в PHAsset, но мне это не удалось. Приведенный ниже код будет работать без ошибок, но представление коллекции будет пустым. Я знаю, что мне не хватает некоторого кода, который обрабатывает результат в делегате средства выбора, потому что каждое решение, которое я пробовал, не удалось. Я думаю, мне также нужно обработать fetchResult в делегате cellForItem, но я тоже потерпел неудачу в этом. Есть идеи, что я делаю неправильно или где найти подход к решению?

Просмотр коллекции

class DetailViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UINavigationControllerDelegate, PHPickerViewControllerDelegate {
    
    var editCollectionView: UICollectionView!
    var photosInTheCellNow = [UIImage]()
    let configuration = PHPickerConfiguration()
    var imageView: UIImageView!
    let imgManager = PHImageManager.default()
    let requestOptions = PHImageRequestOptions()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        
        var config = PHPickerConfiguration()
        config.selectionLimit = 10
        config.filter = PHPickerFilter.images
        let picker = PHPickerViewController(configuration: config)
        picker.delegate = self
        present(picker, animated: true)
        let layout = UICollectionViewFlowLayout()
        
        editCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
        editCollectionView.delegate = self
        editCollectionView.dataSource = self
        editCollectionView.backgroundColor = UIColor.white
        editCollectionView.allowsMultipleSelection = true
        editCollectionView.register(ImageEditCell.self, forCellWithReuseIdentifier: "editCell")
        
        self.view.addSubview(editCollectionView)
        
        editCollectionView.autoresizingMask = UIView.AutoresizingMask(rawValue: UIView.AutoresizingMask.RawValue(UInt8(UIView.AutoresizingMask.flexibleWidth.rawValue) | UInt8(UIView.AutoresizingMask.flexibleHeight.rawValue)))

    }
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        editCollectionView.collectionViewLayout.invalidateLayout()
    }
    
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        dismiss(animated: true)
     
        let identifiers = results.compactMap(\.assetIdentifier)
        let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: identifiers, options: nil)
        print("Identifiers: \(identifiers)")
        print("FetchResults: \(fetchResult)")

    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return photosInTheCellNow.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "editCell", for: indexPath) as! ImageEditCell
        cell.imgView.image =  photosInTheCellNow[indexPath.item]
        return cell
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let width = collectionView.frame.width
        return CGSize(width: width/4 - 1, height: width/4 - 1)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
}

Ячейка просмотра коллекции

class ImageEditCell: UICollectionViewCell {    
    var imgView: UIImageView = {
        var img = UIImageView()
        img.contentMode = .scaleAspectFit        
        return img
    }()
    override func awakeFromNib() {
            super.awakeFromNib()
        }
        override func prepareForReuse() {
            super.prepareForReuse()
        }
}

0 ответов

Другие вопросы по тегам