Как я могу загрузить изображение в виде коллекции и сохранить высоту изображения в ячейке с помощью Alamofireimage в Swift?

Я хочу загрузить изображения с помощью Alamofire и обновить мой collectionView, чтобы увидеть изображения с правильным размером по высоте. Что-то вроде галереи foursquare:

Мой класс это:

//
//  ViewController.swift
//  ImageList
//
//  Created by Dasoga on 4/7/16.
//  Copyright © 2016 Dasoga. All rights reserved.
//

import UIKit
import Alamofire
import AlamofireImage


class ViewController: UIViewController, UICollectionViewDelegate,     UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet var myCollectionView: UICollectionView!

var images:[UIImage] = []
var imagesURL:[String] = ["http://www.apple.com/mx/ipod/home/images/social/og.jpg?201601060706", "http://images.apple.com/home/images/og.jpg?201604012321","http://www.impactony.com/wp-content/uploads/2014/08/Apple-logo1.jpg","http://store.storeimages.cdn-apple.com/4973/as-images.apple.com/is/image/AppleInc/aos/published/images/i/ph/iphone6s/plus/iphone6s-plus-box-gray-2015_GEO_US?wid=478&hei=595&fmt=jpeg&qlt=95&op_sharpen=0&resMode=bicub&op_usm=0.5,0.5,0,0&iccEmbed=0&layer=comp&.v=PS8m10"]
var ImageCache = [String:UIImage]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

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

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = myCollectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as! ImageCollectionViewCell
    cell.backgroundColor = UIColor.blueColor()
    cell.imageViewCell.image = UIImage(named: "placeholderImage")
    cell.imageViewCell.contentMode = UIViewContentMode.ScaleToFill
    //Download image
    let dishName = imagesURL[indexPath.row]
    if let dishImage = ImageCache[dishName] {
        cell.imageViewCell.image = dishImage
    }
    else {
        let url = imagesURL[indexPath.row]
        Alamofire.request(.GET, url)
            .responseImage { response in
                //debugPrint(response)
                debugPrint(response.result)

                if let image = response.result.value {
                    print("image downloaded: \(image)")

                    // Store the commit date in to our cache
                    self.ImageCache[dishName] = image

                    // Update the cell
                    dispatch_async(dispatch_get_main_queue(), {
                        if let cellToUpdate = self.myCollectionView.cellForItemAtIndexPath(indexPath) as? ImageCollectionViewCell{
                            cellToUpdate.imageViewCell.image = image
                            self.images.append(image)
                        }
                    })

                }else{
                    print("error getting image at cell")
                }
        }
    }
    return cell
}

}

Пример четырехугольника:

Я получаю это:

Спасибо!!

Отредактировано:

Я добавил эту строку:

  self.myCollectionView.collectionViewLayout.invalidateLayout()

После:

  // Update the cell
   dispatch_async(dispatch_get_main_queue(), {
                        if let cellToUpdate = self.myCollectionView.cellForItemAtIndexPath(indexPath) as? ImageCollectionViewCell{
                            cellToUpdate.imageViewCell.image = image
                            self.images.append(image)
                            self.myCollectionView.collectionViewLayout.invalidateLayout()
                        }
                    })

И назовите этот метод:

    func collectionView(collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
    let dishName = imagesURL[indexPath.row]
    if let dishImage = ImageCache[dishName] {
        print("found image")
        return CGSizeMake(dishImage.size.width,dishImage.size.height)
    }else{
        return CGSizeMake(200,200)
    }

}

1 ответ

Решение

Попробуйте реализовать протокол UICollectionViewDelegateFlowLayout, который используется для настройки размера ячеек, и используйте эту функцию:

func collectionView(collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,
          sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
    let dishName = imagesURL[indexPath.row]
        if let dishImage = ImageCache[dishName] {
            return CGSizeMake(dishImage.frame.width,dishImage.frame.height)
        }

    }

Этот код будет устанавливать ширину и высоту ячейки, как у изображения, если вы хотите использовать другую ширину, вам нужно изменить ширину в объекте CGSizeMake.

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