当前位置: 首页 > 知识库问答 >
问题:

iOS UICollectionView带有自行调整项目大小的bug?

龚铭
2023-03-14

我正在尝试用自我调整大小的项目实现UICollectionView (flowLayout)。

实现非常简单——我只需设置estimatedItemSize和UICollectionViewCell约束来管理它的大小。

创建集合视图后,第一次重新加载数据时一切正常,但在另一次或其他重新加载时,顶部的少数项目变得与估计的项目大小相同。如果向下和向上滚动,项目大小看起来又很好。

我花了两天时间来研究这个问题,尝试了不同的单元格约束,尝试在不同的地方设置NeedsLayout以及围绕collectionView的其他东西。是bug吗?

共有1个答案

章侯林
2023-03-14

在这篇文章中,我遇到了一个有趣的问题,我找到了自己的答案。有两个重要的功能需要正确使用,它们是:

minimumInteritemSpacingForSectionAtIndex
insetForSectionAtIndex
sizeForItemAtIndexPath

我在Swift中使用它们的例子

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: IndexPath) -> 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 = CGSize(width: cellWidth, height: cellWidth)
    return size
}

最大的秘密是要小心将你的视图附加到尾部边缘和底部布局。如果您只将它们附加到行距和顶部,那么您可以通过框架或约束以编程方式设置宽度和高度。我认为通过约束来做更直接一点,尽管在我的个人项目中我选择了另一种方式,因为在我看来这使功能更简洁。

尝试在cellForItemAt中完成尽可能多的单元格布局。

 类似资料:
  • 问题内容: 我现在有这个: 我想做的是在flexbox中每行有5个项目。目前,它们没有显示是因为它们没有设置宽度/高度,这使我想到了下一个问题。是否可以自动调整项目的大小,以便每行容纳5个项目? 我该怎么做? 谢谢! 问题答案: 您给出的a是正确的,但是您必须调整每个 flex项目 上的4px边距以使其正确 包装 。 最后一行的等宽Flex项目 用途-这表示商品的宽度不会超过宽度的20%(调整边距

  • 视图将被重新创建,使过渡变得非常奇怪,因为它在下一个项目移动的同时会在该项目的上方褪色。出现的新视图没有调整大小,它已处于完整大小。 重新创建视图时,旧视图淡出,新视图淡出,这会使视图背景颜色闪烁。 我还尝试在动画期间在item视图上设置,但这种方法的问题是RecycleView的布局会立即更新,并且不会跟随动画。 我已经为这两次尝试创建了一个小的演示项目。项目的来源在这里。

  • 我有一个简单的问题:我想把一个文本和一个图像放在一行。我试过用display flex,但它总是调整图像的大小,这不是我想要的。 这是我的html代码: 这是我的CSS: 我还想把关闭的imgage放在方框的右边。看起来总是这样: 这可能很容易解决,但我现在很困惑。(感谢您的帮助:)

  • Android最近增加了根据视图大小以及最小和最大文本大小调整TextViews文本大小的支持。 https://developer.Android.com/guide/topics/ui/look-and-feel/autosizing-textView.html 不幸的是,他们不支持EditTexts,那么EditText还有其他的替代方案吗?

  • 问题内容: 我一直试图(徒劳地)建立一个页面,当我更改窗口大小时,其元素将重新调整大小。我可以在CSS中使用它来处理图像,但是没有问题,但是我似乎无法在文本上完成相同的操作,而且我不确定在CSS中是否有可能。而且我似乎找不到能完成此任务的jQuery脚本。 当用户调整窗口大小时,我实质上希望页面能够动态流畅地缩放,而无需用户调用页面缩放。通过css在我的img div上这可以正常工作,但对于文本则

  • 问题内容: Qt解决方案是对 resizeColumnsToContent() 的单个调用,在.NET中,可以使用 TextRenderer.MeasureText() ,而JTable可以使用 AUTO_RESIZE_ALL_COLUMNS 。 在SWT中,是否有一种方法可以在填充列之后以编程方式调整列的大小? 调用将返回相同的值,因此将忽略列中剩余的字符。 TableColumn具有,但是如何