2016-07-23 73 views
0

问题是何时加载应用程序的第一次,延迟连接图像加载到错误的位置时滚动集合的图像将改变几次直到滚动结束,图像将返回到正确的图像。我不知道为什么会发生这种情况。加载应用程序后,图像采取正确的位置。我使用Alamofire和Alamofire图像。UICollectionView在滚动时加载图像位置错误Alamofire

型号Noticia:

import UIKit 
import SwiftyJSON 
import Alamofire 
import AlamofireImage 

class Noticia: NSObject { 
    //MARK: - Properties 
    var name:String = "" 
    var image:String = "" 
    var number:Int = 0 
    let photoCache = AutoPurgingImageCache(
     memoryCapacity: 100 * 1024 * 1024, 
     preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 
    ) 

    override init() { 

    } 

    func setData(obj:JSON)->Noticia{ 
     self.name = obj["titulo"].stringValue 
     self.image = obj["imagen_portada"].stringValue 
     self.number = Int(obj["id"].stringValue)! 
     return self 
    } 

    //MARK: - Image Caching 

    func cacheImage(image: Image, urlString: String) { 
     photoCache.addImage(image, withIdentifier: urlString) 
    } 

    func cachedImage(urlString: String) -> Image? { 
     return photoCache.imageWithIdentifier(urlString) 
    } 

} 

的ViewController

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NoticiaCell 
    let cell2 = collectionView.dequeueReusableCellWithReuseIdentifier("CellBillboard", forIndexPath: indexPath) as! BillboardCell 
    //Billboard Cell 
    if(indexPath.item == 0){ 
     cell2.contact = noticia[indexPath.item] 
     return cell2 
    }else{ 
     //Square News Cell 
     cell.contact = noticia[indexPath.item] 
     cell.layer.borderColor = ConstantProjectClass.colorBorderWebBizarro.CGColor 
     cell.layer.borderWidth = ConstantProjectClass.noticiasBorderWidth 
     //Layout custom 
     cell.setNeedsLayout() 
     cell.layoutIfNeeded() 
     return cell 
    } 

} 

Noticia细胞

import UIKit 
import Alamofire 
import AlamofireImage 

class NoticiaCell: UICollectionViewCell { 
    //MARK: - Properties 
    @IBOutlet weak var labelView: UILabel! 
    @IBOutlet weak var imageView: UIImageView! 
    @IBOutlet weak var topLabelConstraint: NSLayoutConstraint! 
    @IBOutlet weak var topImageConstraint: NSLayoutConstraint! 
    var imageUrlString:String? 

    var contact:Noticia = Noticia(){ 
     didSet{ 
      self.labelView.text = self.contact.name 

      imageUrlString = self.contact.image 

      self.imageView.image = nil 

      if let imageFromCache = self.contact.cachedImage(imageUrlString!){ 
       self.imageView.image = imageFromCache 
       return 
      } 

      Alamofire.request(.GET, self.contact.image) 
       .responseImage { response in 
        if let image = response.result.value { 
         dispatch_async(dispatch_get_main_queue(), { 
          let imageToCache = image 
          self.imageView.image = imageToCache 
          self.contact.cacheImage(imageToCache, urlString: self.contact.image) 
         }) 
        } 
       } 
      } 
    } 
} 

任何帮助吗?

+0

我会建议回避拖尾和底部约束在集合视图中。对具有插口的宽度约束使用前导和顶部约束。动态设置宽度并给出宽高比,或查找其他路线。 [实施例](http://stackoverflow.com/questions/38517114/collection-view-cells-have-incorrect-content-size) – Sethmr

回答

0

读几个岗位后,我成立了解决方案:

的ViewController

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NoticiaCell 
     let cell2 = collectionView.dequeueReusableCellWithReuseIdentifier("CellBillboard", forIndexPath: indexPath) as! BillboardCell 
     print("entro") 
     //Billboard Cell 
     if(indexPath.item == 0){ 
      cell2.contact = noticia[indexPath.item] 
      return cell2 
     }else{ 
      //Square News Cell 
      cell.labelView.text = noticia[indexPath.item].name 

      imageUrlString = noticia[indexPath.item].image 

      cell.imageView.image = nil 

      if let imageFromCache = noticia[indexPath.item].cachedImage(imageUrlString!){ 
       cell.imageView.image = imageFromCache 

      }else{ 

       Alamofire.request(.GET, noticia[indexPath.item].image) 
        .responseImage { response in 
         if let image = response.result.value { 
          let imageToCache = image 

          if let updatedCell = collectionView.cellForItemAtIndexPath(indexPath) as? NoticiaCell{ 
           updatedCell.imageView.image = imageToCache 
          } 

          self.noticia[indexPath.item].cacheImage(imageToCache, urlString: self.noticia[indexPath.item].image) 

         } 
       } 
      } 

      cell.layer.borderColor = ConstantProjectClass.colorBorderWebBizarro.CGColor 
      cell.layer.borderWidth = ConstantProjectClass.noticiasBorderWidth 
      //Layout custom 
      cell.setNeedsLayout() 
      cell.layoutIfNeeded() 
      return cell 

     } 
    } 

的关键是下面的代码:

if let updatedCell = collectionView.cellForItemAtIndexPath(indexPath) as? NoticiaCell{ 
    updatedCell.imageView.image = imageToCache 
} 
相关问题