Swift объединяет PHAsset и UIImage в CollectionView - PullRequest
0 голосов
/ 10 октября 2018

Мне нужно объединить PHAsset и UIImage в UICOllectionView

UIImage получить из строки и преобразовать в изображение

PHAsset получить из альбома устройства

var assetCollection: PHAssetCollection!
var photosAsset: PHFetchResult<AnyObject>!
var assetThumbnailSize: CGSize!
var downloadImages: [String] = []

В cellForItemAt я пытаюсь:

    let indexP = indexPath.row

    let asset: PHAsset = self.photosAsset[indexP] as! PHAsset

    PHImageManager.default().requestImage(for: asset, targetSize: self.assetThumbnailSize, contentMode: .aspectFill, options: nil, resultHandler: {(result, info)in
    if result != nil {
    let download = self.downloadImages[indexP]
    let downloadIm = "http://...\(download)"

     cell.albumImage.downloadImage(from: downloadIm)

     cell.albumImage.image = result

}
})
return cell

как мне объединить downloadIm и результат для отображения в UIImageView на collectionView?

downloadImage:

extension UIImageView {

    func downloadImage(from imgURL: String!) {
        let url = URLRequest(url: URL(string: imgURL)!)

        let task = URLSession.shared.dataTask(with: url) {
            (data, response, error) in

            if error != nil {
                print(error!)
                return
            }

            DispatchQueue.main.async {
                self.image = UIImage(data: data!)
            }

        }

        task.resume()
    }
}

1 Ответ

0 голосов
/ 10 октября 2018

Я столкнулся с той же проблемой в одном из моих проектов.Необходимо обрабатывать как UIImage, так и строковый URL в одном и том же UICollectionView.Вы можете реализовать подобное к этому;

// first create struct with datatypes
struct imageItem {
    var stringImageURL:String 
    var imageGallery:UIImage
}
var array_ImagesList: [imageItem] = []

// тогда вы можете добавить изображение или строковый URL-адрес, где вы хотите в соответствии с функциональностью // внутри UIImagePickerController Делегаты Я добавляю UIImage

func imagePickerController(_ picker: UIImagePickerController, 
  didFinishPickingMediaWithInfo info: [String : Any]) {

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
        array_ImagesList.append(imageItem.init(stringImageURL: "", 
        imageGallery: image))
    }
   picker.dismiss(animated: true, completion: nil);
 }

// and in some other function I want to append image from server URL

func addImagesFromServer() {
let imageUrl: String = "htps://someserver/image.png"
 array_ImagesList.append(imageItem.init(stringImageURL: imageUrl!, 
 imageGallery:""))

 collectionView.reloadData()
}

//MARK: CollectionView DataSources & Delegates
func collectionView(_ collectionView: UICollectionView, 
   numberOfItemsInSection section: Int) -> Int {
    return array_ImagesList.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt 
    indexPath: IndexPath) -> UICollectionViewCell{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: 
      "kGalleryImageCell", for: indexPath as IndexPath) as! 
     AddImagesCollectionViewCell
    //  check to show image or from url here
      // for image
       cell.imageView.image = array_ImagesList[indexPath.row].imageGallery
      // from image url
                let stringUrlImage = 
                    array_ImagesList[indexPath.row].stringImageURL
                let placeholderImage = UIImage(named: 
                "logoCategorySmallIcon")!
                if(stringUrlImage.isEmpty){
                    cell.imageGalleryCell.image = placeholderImage

                }else{
                    var stringImageUrl = imageHostAPI+"\(stringUrlImage)"
                    stringImageUrl = 
             stringImageUrl.addingPercentEncoding(withAllowedCharacters: 
            CharacterSet.urlQueryAllowed)!
                    let url = URL(string: stringImageUrl)

                    cell.imageView.sd_setShowActivityIndicatorView(true)
                    cell.imageView.sd_setIndicatorStyle(.gray)
                    cell.imageView.sd_setImage(with: url!, 
                   placeholderImage: placeholderImage)
                }

          return cell
    }
...