集合视图单元格的内容大小不正确

时间:2021-11-28 19:02:38

I made a collection view with 144 cells. I have them setup for single selection. I have been playing with the settings I have for a while now, but any setup that actually displays the cells correctly has this problem where two specific cells consistently are the wrong size. Note that the problem only happens when testing on the iPad pro. They will resize often under conditions that I can't replicate when changing their image to others back and forth. I try to only call reloadData() when absolutely necessary, and call the reload individual cell at indexPath function. I have tested about everything I can think of to prevent this from being an issue. Any pointers in the right direction would be highly appreciated!

我用144个单元格创建了一个集合视图。我有他们设置单选。我一直在玩我现有的设置一段时间,但实际正确显示单元格的任何设置都有这个问题,其中两个特定单元格的大小一致。请注意,问题只发生在iPad专业版上进行测试时。他们会经常在我不能复制他们的形象来回复制的条件下调整大小。我尝试只在绝对必要时调用reloadData(),并在indexPath函数中调用重新加载单个单元格。我已经测试了我能想到的一切,以防止这成为一个问题。任何正确方向的指针都将受到高度赞赏!

Here is an image: 集合视图单元格的内容大小不正确

这是一张图片:

Here is my code:

这是我的代码:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ChartViewCell
    cell.setColor(colorArray[indexPath.section][indexPath.row])
    cell.overlay?.image = cell.whichColor.toImage()
    return cell
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 24
}

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

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionView, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
    return 0
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
    return UIEdgeInsetsMake(0, 0, 0, 0)
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let screenRect: CGRect = collectionView.bounds
    let screenWidth: CGFloat = screenRect.size.width
    let cellWidth: CGFloat = screenWidth / 24
    //Replace the divisor with the column count requirement. Make sure to have it in float.
    let size: CGSize = CGSizeMake(cellWidth, cellWidth)
    return size
}

2 个解决方案

#1


1  

I do encounter the same problem with my previous project. I managed to solve the problem by using this library: Snapkit . import the library in pod and implement it in cellForItemAtIndexPath

我确实遇到了与之前项目相同的问题。我设法通过使用这个库来解决问题:Snapkit。在pod中导入库并在cellForItemAtIndexPath中实现它

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ChartViewCell

    let width = self.view.bounds.size.width / 24
    cell.overlay.snp_makeConstraints { (make) -> Void in
        make.width.equalTo(width)
        make.height.equalTo(width)
    }
    cell.setColor(colorArray[indexPath.section][indexPath.row])
    cell.overlay?.image = cell.whichColor.toImage()
    return cell
}

Just put only top and leading constraint on the imageView in the storyboard. Hope it helps.

只在故事板中的imageView上放置顶部和前导约束。希望能帮助到你。

#2


0  

I fixed the problem by doing the following:

我通过执行以下操作来解决问题:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ChartViewCell
    cell.setColor(colorArray[indexPath.section][indexPath.row])
    cell.overlay?.image = cell.whichColor.toImage()

    let screenRect: CGRect = collectionView.bounds
    let screenWidth: CGFloat = screenRect.size.width
    let cellWidth: CGFloat = screenWidth / 24
    cell.singleCellWidthConstraint.constant = cellWidth - 8
    cell.overlayWidthConstraint.constant = cellWidth - 4
    return cell
}

I just added a width constraint for the images, and added an outlet to them in the cells class. Then I deleted the bottom and right constraints and added a 1:1 constraint on the images. It worked like a charm on all devices!

我刚为图像添加了宽度约束,并在单元格类中添加了一个插座。然后我删除了底部和右边的约束,并在图像上添加了1:1约束。它在所有设备上都像一个魅力!

#1


1  

I do encounter the same problem with my previous project. I managed to solve the problem by using this library: Snapkit . import the library in pod and implement it in cellForItemAtIndexPath

我确实遇到了与之前项目相同的问题。我设法通过使用这个库来解决问题:Snapkit。在pod中导入库并在cellForItemAtIndexPath中实现它

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ChartViewCell

    let width = self.view.bounds.size.width / 24
    cell.overlay.snp_makeConstraints { (make) -> Void in
        make.width.equalTo(width)
        make.height.equalTo(width)
    }
    cell.setColor(colorArray[indexPath.section][indexPath.row])
    cell.overlay?.image = cell.whichColor.toImage()
    return cell
}

Just put only top and leading constraint on the imageView in the storyboard. Hope it helps.

只在故事板中的imageView上放置顶部和前导约束。希望能帮助到你。

#2


0  

I fixed the problem by doing the following:

我通过执行以下操作来解决问题:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ChartViewCell
    cell.setColor(colorArray[indexPath.section][indexPath.row])
    cell.overlay?.image = cell.whichColor.toImage()

    let screenRect: CGRect = collectionView.bounds
    let screenWidth: CGFloat = screenRect.size.width
    let cellWidth: CGFloat = screenWidth / 24
    cell.singleCellWidthConstraint.constant = cellWidth - 8
    cell.overlayWidthConstraint.constant = cellWidth - 4
    return cell
}

I just added a width constraint for the images, and added an outlet to them in the cells class. Then I deleted the bottom and right constraints and added a 1:1 constraint on the images. It worked like a charm on all devices!

我刚为图像添加了宽度约束,并在单元格类中添加了一个插座。然后我删除了底部和右边的约束,并在图像上添加了1:1约束。它在所有设备上都像一个魅力!