【问题标题】:How to change collection view cell size and add padding?如何更改集合视图单元格大小并添加填充?
【发布时间】:2018-12-24 15:42:57
【问题描述】:

我试图让我的 collectionView 单元格看起来像下面的图片,但我没能做到。我尝试使用 collectionViewLayout 但无法正确调整大小以及正确的填充。我怎么能做到这一点?

这是我的代码

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            let frameSize = collectionView.frame.size
            return CGSize(width: frameSize.width, height: frameSize.height / 2)

    }

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

这是我正在努力实现的目标的图片。谢谢

【问题讨论】:

    标签: ios swift uiviewcontroller uicollectionview uicollectionviewcell


    【解决方案1】:

    实现UICollectionViewFlowLayout的以下方法

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

    对于 27px 插图使用

    yourcollectionView.sectionInset = UIEdgeInsets(top: 10, left: 27, bottom: 10, right: 27)
    

    要使用实现此协议的类,您必须设置集合视图的委托属性。

    yourcollectionView.delegate = /* object which implement flow layout delegate */
    

    UICollctionViewDelegate自动符合UICollectionViewFlowLayoutDelegate,设置代理就够了。

    在计算单元格大小时,您还遗漏了另一件事。您的单元格大小计算错误。实现如下

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                let frameSize = collectionView.frame.size
                let size = (frameSize.width - 64.0) / 2.0 // 27 px on both side, and within, there is 10 px gap.
                return CGSize(width: size, height: size)
    
        }
    

    如果您使用情节提要来设置 UI Widget 的布局,您也可以在情节提要中设置它们。

    【讨论】:

    • 但是从侧面算起的 27 个点呢?还有为什么你把同样的东西写了两次?
    • 对于答案的第一部分,您写了两次 public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 10 } - 为什么?
    • 如果你仔细看,两个函数的区别只是第一个是minimumInteritemSpacingForSectionAt,第二个是minimumLineSpacingForSectionAt
    • 你的单元格大小计算也是错误的,我已经更新了答案,请看一下。
    • 我需要单元格宽度为 157。当我将您的数学更改为 (375-61)/2 = 157 时,所有内容都变为单行而不是每行两个单元格。知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多