【问题标题】:How to determine UICollectionView width when scrolling is disabled禁用滚动时如何确定 UICollectionView 宽度
【发布时间】:2017-08-12 14:19:50
【问题描述】:

我正在构建的内容: 我正在构建一个相机滤镜应用程序。有多个过滤器类别,每个类别中都包含过滤器。 IE:UICollectionView 中的 UICollectionView。

问题:当 isScrollEnabled 设置为 false 时,UICollectionView(过滤器类别)中的 UICollectionView(过滤器)未显示所有宽度。

这里是确定第二个 UICollectionView 宽度的代码。宽度是通过将一个过滤器的大小乘以需要显示的过滤器数量来计算的。这给出了一个完美的宽度,当 isScrollEnabled 设置为 true 时我可以滚动,但是,问题是当 isScrollEnabled 设置为 false 时,由于我无法滚动整个宽度,看起来 UICollectionView 的宽度太小了

    filtersCollection.frame.size.width = contentView.frame.width * CGFloat(filters.count) + 10
    filtersCollection.register(FilterCell.self, forCellWithReuseIdentifier: "FilterCell")
    filtersCollection.delegate = self
    filtersCollection.dataSource = self

基本上是我想要的:我想要的是它能够在不滚动的情况下显示所有的 collectionviews 宽度。

截图说明:蓝色/红色便于解释。蓝色是父collectionView中的一个单元格。 RED 是单元格内的 collectionView。红色collectionview的宽度有点太小了。该集合视图中只有两个过滤器/单元格,启用滚动后,它的大小非常完美(您可以滚动到视图的末尾)。虽然当 isScrollEnabled 设置为 false 时,我显然无法查看整个宽度。 正如您从右侧的屏幕截图中看到的那样,随着单元格的增多,问题会变得更糟,看起来宽度甚至更小。 (这让我想到它可能与部分插图有关)

我尝试过的: 1. 我认为它可能是 UICollectionViewFlowLayout 的部分插图,尽管我已经将我的插图注释掉了,所以从我看来它与部分插图无关。 (单元格看起来有插图的原因是因为图像和文本的 x 值在单元格内设置为 5 个像素。)所以在我的计算中它仍然使用整个单元格的框架...... 我真的困惑,我已尽力解释。请不要投反对票,我确实到处搜索但没有找到,如果您确实找到了一些东西,请在此处链接我!谢谢!

【问题讨论】:

    标签: ios swift uiscrollview uicollectionview


    【解决方案1】:

    为了全宽显示子集合视图,您必须满足以下两个要求:

    1. 代表子集合视图的单元格具有正确的宽度。
    2. 子集合视图的大小必须与单元格的大小完全相同。

    因此,对于要求 #1,您必须重写以下委托方法:

    optional func collectionView(_ collectionView: UICollectionView, 
                          layout collectionViewLayout: UICollectionViewLayout, 
                   sizeForItemAt indexPath: IndexPath) -> CGSize
    

    将代表子集合视图的单元格的大小更改为全宽(取决于子项的数量)。

    【讨论】:

    • 嘿,谢谢,我想我们对这个问题有不同的理解,尽管你的想法给了我洞察力,最终导致我发现了解决方案。谢谢!
    • 别担心,伙计
    【解决方案2】:

    我想通了。问题是 minimumLineSpacingForSectionAt。显然有一个默认值,在每个单元格之间放置了一些像素。我通过使用下面的 UICollectionViewDelegateFlowLayout 函数 minimumLineSpacingForSectionAt 解决了这个问题:

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

    我只是返回 0 删除间距,然后一切都合适。 虽然我仍然想要单元格之间的间距,所以我返回了五个而不是这样

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 5
    }
    

    这又搞砸了,虽然这次我知道 minimumLineSpacingForSectionAt 是什么,所以我将它包含在我的等式中,以查找 subbed collectionView 的宽度以及 collectionView 所在单元格的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多