ios - 纵向和横向的 UICollectionView 单元格间距

标签 ios swift xcode uicollectionview

我的目标是使纵向和横向单元格之间的间距相等。我可以在纵向方向上这样做,但不能在横向方向上做到这一点。我想通过拉伸(stretch)图像的宽度和高度来缩小横向方向的差距。

纵向 View 每行 2 个单元格,横向 View 每行 3 个单元格。

Portrait Orientation Landscape Orientation

我的代码如下:

override func viewDidLoad() {
    super.viewDidLoad()

    if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
        let itemsPerRow: CGFloat = 2
        let padding: CGFloat = 5
        let totalPadding = padding * (itemsPerRow - 1)
        let individualPadding = totalPadding / itemsPerRow
        let width = (collectionView?.frame.width)! / itemsPerRow - individualPadding
        let height = width
        flowLayout.itemSize = CGSize(width: width, height: height)
        flowLayout.minimumInteritemSpacing = padding
        flowLayout.minimumLineSpacing = padding
    }
}

最佳答案

试试这个:

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.backgroundColor = .white
    collectionView.alwaysBounceVertical = true
    collectionView.contentInsetAdjustmentBehavior = .always
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    cell.backgroundColor = .blue
    return cell
}


var spacing: CGFloat = 8

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

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

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let safeFrame = view.safeAreaLayoutGuide.layoutFrame
    let size = CGSize(width: safeFrame.width, height: safeFrame.height)
    return setCollectionViewItemSize(size: size)

}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.invalidateLayout()
    }
}

func setCollectionViewItemSize(size: CGSize) -> CGSize {
    if UIApplication.shared.statusBarOrientation.isPortrait {
        let width = (size.width - 1 * spacing) / 2
        return CGSize(width: width, height: width)
    } else {
        let width = (size.width - 2 * spacing) / 3
        return CGSize(width: width, height: width)
    }
}

结果是这样的:

enter image description here

关于ios - 纵向和横向的 UICollectionView 单元格间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56106271/

相关文章:

ios - 当库没有发布 podspec 时,解决 cocoapods 中的依赖关系

objective-c - 如何结束使用 detachNewThreadSelector 创建的轮询线程?

xcode - NSTableView 在 NSSplitView 中显示不正确

iOS 14 通知不显示图像

ios - UIViewControllerHierarchyInconsistency 仅在 iOS 8 和 Xcode 6 中崩溃应用程序

ios - 在 objective-c 中放置常量字符串的最佳位置是什么?

ios - 如何自定义 AppRTC 接听电话

ios - 从 Watson Customer Engagement on Swift 获取 channel 和用户 ID

swift - 我可以通过将可选参数用作参数来检查可选参数是否为 nil 吗?

swift - 检查 indexPath.row 是否是第 1-10 行?