Как преобразовать активы в UIImages для отображения фотографий в UICollectionView? - PullRequest
0 голосов
/ 10 июля 2020

Я использовал библиотеку DKImagePickerController для выбора и отображения нескольких изображений из библиотеки iPhone фотографий, и моя цель - отобразить выбранные изображения в UICollectionView. Сначала ресурсы передаются от одного контроллера представления к другому (контроллеру представления «Предварительный просмотр») в виде массива типа «DKAsset», который, как я полагаю, требует библиотеки. Предварительный просмотр V C - это то место, где я пытаюсь отобразить фотографии в представлении коллекции.

Для этого я попытался преобразовать DKAsset в UIImages перед их сохранением в пустом массиве типа UIImage. Возможно, мой подход ошибочен, но я не смог преобразовать активы в UIImages (т.е. оператор print (images) в viewDidLoad возвращает пустой массив), хотя конечной целью является просто отображение фотографий в Просмотр коллекции.

Может ли кто-нибудь помочь мне выяснить, как этого добиться? Мой код ниже. Большое спасибо.

class PreviewImageViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

@IBOutlet var collectionView: UICollectionView!

var assets: [DKAsset] = []
var images: [UIImage] = []

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.dataSource = self
    collectionView.delegate = self
    print(assets)
    
    convertAssetsToImages()
    //the print statement below return an empty array, so something is not working
    print(images)
}

//the function below is how I've been attempting to convert DKAssets to UIImages, in order to store them in the empty UIImage array.
func convertAssetsToImages() {
    for asset in assets {
        asset.fetchOriginalImage(completeBlock: {(image, info) in
            
            self.images.append(image!)

        })
    }
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return assets.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell
    //the 'previewImage' below is an IBOUtlet of a UIImageView in another Swift file called 'CollectionViewCell'
    cell.previewImage.image = images[indexPath.item]
    return cell
} 
}

1 Ответ

1 голос
/ 11 июля 2020

Я думаю, что print(images) срабатывает до завершения блока, поэтому он все еще пуст. Вы можете протестировать печать в журналах в блоке convertAssetsToImages(), чтобы увидеть, что и когда срабатывает. Возможное решение - удалить массив UIImage, чтобы иметь один массив (проще управлять), и преобразовать актив в UIImage в collectionView cellForRow

Код будет выглядеть так:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell
    
    // Get asset at indexPath
    let asset = assets[indexPath.item]
    asset.fetchOriginalImage(completeBlock: {(image, info) in
        
        if let image = image {
            cell.previewImage.image = image
        }
    })
    
    
    return cell
}

И не забудьте вызвать collectionView.reloadData() в viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.dataSource = self
    collectionView.delegate = self
    collectionView.reloadData()
    print(assets)
}

Вы можете удалить массив UIImage и все, что на него ссылается

Надеюсь, это поможет - дайте мне знать, если это не работает, я запущу код и помогу найти решение

...