【问题标题】:UICollectionViewCell zero spacing not workingUICollectionViewCell 零间距不起作用
【发布时间】:2020-06-01 14:26:42
【问题描述】:

我确实根据UICollectionView 创建了一个自定义日历。

一个UICollectionViewCell - 日历中的一个日期。我想删除单元格之间的间距。 CollectionView布局设置-

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: (collectionView.frame.width / 7), height: collectionView.frame.width / 7)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}

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

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

在不同的屏幕尺寸下,除非是 iPhone X,否则我们会看到单元格之间的间距。

如何解决?

【问题讨论】:

    标签: swift uicollectionview uikit


    【解决方案1】:

    您可能有一个舍入错误。你在说

    collectionView.frame.width / 7
    

    iPhone 11 的宽度为 414 磅。 414 / 7 是 59.14285714。没有办法在屏幕上描绘小数点,那么现在怎么办?我们向下取整,现在单元格之间多了一个像素空间。

    【讨论】:

    • 那么,我该如何解决呢?你能帮帮我吗?
    • 好吧,显然你必须为单元格宽度提供整数值——这些值正好加到屏幕宽度上,即使它们与 same 值不同>每个细胞。但是,我很难回答整个问题,因为我认为使用带有流布局的集合视图来制作网格是愚蠢的。
    • 您好!我找到了解决方案。检查我的答案
    【解决方案2】:

    正如马特在他的回答中所说的那样,当您提供 collectionView.frame.width / 7 时,小数位会四舍五入。似乎您正试图避免这种情况,因为您不希望用户看到单元格之间的那一点间隙。大多数情况下,由于像素密度,您只会在模拟器上看到它,而不是在真实设备上看到。您可以通过将UICollectionViewFlowLayout 替换为UICollectionViewCompositionalLayout 来克服此故障,UICollectionViewCompositionalLayout 只能从iOS 12 获得。一个简单的解决方法是为单元格创建一个自定义背景视图,将UICollectionViewCell 仅扩展 1 个像素。以下是我如何尝试实现此目的的示例:

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        cell.backgroundColor = .purple
        let view = UIView()
        view.backgroundColor = .brown
        cell.addSubview(view) // Comment this line and you can see the gap
        view.frame = cell.bounds
        view.frame.size = CGSize(width: view.frame.size.width + 1, height: view.frame.size.height + 1)
        return cell
    }
    

    这是我不久前发现的一个不错的小技巧。希望这对你也有帮助。

    【讨论】:

    • 您好!我找到了解决方案。检查我的答案
    【解决方案3】:

    我找到了解决方案 - 1. 从日历视图中删除故事板前导和尾随约束。 2.设置中心水平约束 3. 为日历视图设置宽度约束。 4.创建@IBOutlet calendarWidthConstraint 5. 在 vi​​ewDidLoad -

    let layout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    let width = self.view.frame.width
    let cellSize = CGFloat(width / 7).rounded()
    let newWidth = cellSize * 7
    layout.itemSize = CGSize(width: cellSize, height: cellSize)
    calendarWidth.constant = newWidth
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    collectionView.collectionViewLayout = layout
    

    【讨论】:

    • 所以基本上你完全按照我在回答中所说的做了,然后你给自己打勾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2018-02-05
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多