如何在禁用滚动时确定UICollectionView宽度

时间:2017-03-21 04:08:01

标签: ios swift uiscrollview uicollectionview

我正在构建的内容: 我正在构建一个相机过滤器应用程序有多个过滤器类别,每个类别都包含过滤器。 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

基本上我想要的东西:我想要的是它能够在不滚动的情况下显示所有的集合视图宽度。

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

我尝试了什么: 1.我认为它可能是UICollectionViewFlowLayout的部分插入,虽然我已经评论了我的插图,所以从我看到它与插件插入无关。 (单元格看起来有插图的原因是因为图像和文本的x值在单元格中设置为5个像素。)因此在我的计算中它仍然使用整个单元格的框架... 我是真的困惑,我已尽力解释。请不要下来投票我到处搜索并没有找到它,如果你找到了什么,请在那里链接我!谢谢!

Screenshot of issue Screenshot of issue0

2 个答案:

答案 0 :(得分:1)

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

  1. 表示子集合视图的单元格具有正确的宽度。
  2. 子集合视图的大小必须与单元格的大小完全相同。
  3. 因此,对于需求#1,您必须覆盖以下委托方法:

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

    将表示子集合视图的单元格大小更改为完整宽度(取决于子项目的数量)。

答案 1 :(得分:0)

我明白了。问题是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所在的单元格的大小。