Использование 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()
}
}