带有图像数组的 UICollectionView 设置正确

Posted

技术标签:

【中文标题】带有图像数组的 UICollectionView 设置正确【英文标题】:UICollectionView with array of images set it right 【发布时间】:2017-08-09 12:56:40 【问题描述】:

我有一个问题。在 UICollectionView 内,我有 UIImage 和 Content Mode - Aspect Fit ... 现在我需要在 UICollectionView 中显示一个靠近另一个的图像。现在他们之间有很大的空间。

extension UserDetailInformationOfAnimalViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 
func numberOfSections(in collectionView: UICollectionView) -> Int 
    return 1


//MARK: - Collections
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    let post = postsArray[collectionView.tag]
    //        print("count: ", post.imagesLink.count)
    return post.imageLinks.count


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell

    let post = postsArray[collectionView.tag]
    //        print("postArrayPhotos: ", post.imagesLink.count)
    if post.imageLinks.count != 0 
        //            print("POST = ", post)
        //            print("Look here: ", post.imagesLink[indexPath.row].imageLink)
        //            print("IMAGELINK = ", post.imagesLink[indexPath.row].imageLink)
        let imageLink = post.imageLinks[indexPath.row]

        if imageLink.imageLink != nil 
            let url = URL(string: imageLink.imageLink!)
            print("IMAGELINK = ", imageLink)

            cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed:  (image, error, cacheType, imageURL) in
            )
        
    

    return cell


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
    let height = self.view.frame.size.height;
    let width  = self.view.frame.size.width;
    // in case you you want the cell to be 40% of your controllers view
    return CGSize(width: width, height: height * 0.35)
  

【问题讨论】:

UICollection horizontally scroll, so reduce the space between cell item的可能重复 没有,我很早就看到了,但是没有用。 我会检查当前的单元格框架,它可能与您设置的一样正确,但图像的宽度比您的单元格小。同样对于带有收藏视图的图片库,我将一个单元格用于一个部分,因此部分数 = 项目数。 【参考方案1】:

使用此方法动态设置单元格宽度

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
    if indexPath.row == whatever you want 
        return CGSize(width: collectionView.frame.size.width/2, height: collectionView.frame.size.width/2)
    

【讨论】:

你能展示你的代码,你用来在你的应用程序中设置图像吗? 另外,如果您不使用任何东西从代码进行设置。尝试使用,约束并保持纵横比和宽度和高度。这绝对适合你 这样试试HomeViewController:UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout magin 将由UICollectionViewDelegateFlowLayout 完成 添加我的代码。我认为 func sizeForItemAt 打破了一切。 检查使用方面填充,看看是否相应地填充空间?如果是这样,那么它的不同问题【参考方案2】:

我了解您的问题。在这里,我给你一个方法。此解决方案可能对您无效,但它会让您知道如何解决它。主要概念是您必须根据图像返回单元格大小。但立即图像不在您的手中。它在服务器上。所以你可以先返回一个演示或占位符图像高度,然后在完成从服务器下载实际图像后告诉集合视图根据实际图像大小重新布局单元格。

 cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed:  (image, error, cacheType, imageURL) in
           //told the collection view to relayout according to image size
           collectionView.collectionViewLayout.invalidateLayout()          
    )

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        let cell = collectionView.cellForItem(at: indexPath) as! CollectionViewCell
        return cell.imageOfAnimalInCollectionView.image.size! // Put your logic here, until actual image download from server you can return a default size.
    

【讨论】:

谢谢!我会尝试弄清楚它是如何工作的并尝试使用它。

以上是关于带有图像数组的 UICollectionView 设置正确的主要内容,如果未能解决你的问题,请参考以下文章

内存管理(带有图像的 UICollectionView)

Swift 3 iOS 10 - 带有图像和文本的 UICollectionView 无法正确显示

图像数组不是从数据加载到 UICollectionView 而是从简单数组加载?

如何将相机/照片库中的图像保存到要在 UICollectionView 中显示的数组中

UICollectionView:1 行水平滚动(从右到左),带有来自右侧的新单元格的自定义动画

UICollectionview 带有动态数据的自定义布局