在 iOS 上创建 Nx2 集合视图

Posted

技术标签:

【中文标题】在 iOS 上创建 Nx2 集合视图【英文标题】:Creating a Nx2 collection view on iOS 【发布时间】:2015-11-22 11:15:54 【问题描述】:

我正在尝试创建一个 Nx2(n 行,2 列)集合视图,其中单元格大小会动态调整以完全适合屏幕。

所以我的故事板中有以下控制器:

这是集合视图的约束:

这是各自的视图控制器代码:

import UIKit

class SREventAttendeesCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 

    var screenSize: CGRect!
    var screenWidth: CGFloat!
    var screenHeight: CGFloat!


    @IBOutlet weak var collectionView: UICollectionView!


    override func viewDidLoad() 
        super.viewDidLoad()

        collectionView.delegate = self
        collectionView.dataSource = self

        screenSize = UIScreen.mainScreen().bounds
        screenWidth = screenSize.width
        screenHeight = screenSize.height
        let collectionViewWidth = (self.collectionView.frame.size.width/2)

        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        layout.itemSize = CGSize(width: collectionViewWidth, height: screenHeight/3)
        collectionView.setCollectionViewLayout(layout, animated: true)

    

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
        return 2
    

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 2
    

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionCell", forIndexPath: indexPath) as! SRCollectionViewCell

        // Configure the cell
        let collectionViewWidth = (self.collectionView.frame.size.width/2)
        print(collectionViewWidth)
        cell.frame.size.width = collectionViewWidth
        cell.nameAgeLabel.frame.size.width = collectionViewWidth


        //cell.pictureImageView.image = myImage
        return cell
    


遗憾的是,这导致以下情况:

有人知道我在这里缺少什么吗?

【问题讨论】:

您的应用适用于所有 iphone 或某些特定手机。 这必须适用于所有手机 只是减少你的收藏的宽度并检查........ 【参考方案1】:

当然,首先您的代码在集合视图流布局方面存在一些问题。

1) 你不需要像 Objective C 中那样指定 UICollectionViewFlowLayout 的类型。Swift 可以自动匹配。相反,您应该向下转换为所需的类型(我稍后会谈到)

2) 我不会创建一个新的布局对象并分配它。相反,我只会影响当前布局对象(请参阅下面的示例代码)

3) 您没有考虑 minimumInterItemSpacing 值,这就是您的单元格不适合每行 2 个的原因。

我将对您的集合视图流布局代码的实现方式进行一些更改。这就是我将如何实现这一点(我没有编译这个,所以可能会有一些小错误):

let screenWidth = collectionView.bounds.size.width;

if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout 
   layout.sectionInset = UIEdgeInsetsMake(0,0,0,0)
   layout.minimumInteritemSpacing = 0
   layout.minimumLineSpacing = 0

   let avaliableWidth = screenWidth - (layout.sectionInset.left + layout.sectionInset.right + layout.minimumInteritemSpacing)

   let itemWidth = avaliableWidth / 2

   // You can set the value of 50 to whatever your height is
   layout.itemSize = CGMake(itemWidth, 50) 

【讨论】:

以上是关于在 iOS 上创建 Nx2 集合视图的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 14 上,按钮不会通过触摸到集合视图单元格

iOS:自适应集合视图单元格宽度

iOS 15 Simulator - 滚动时呈现损坏的集合视图单元格......?

以编程方式创建形状视图并在集合视图单元格上使用

iOS - 实现自定义集合视图布局

在 iOS 10 中使用标签栏控制器时,集合视图的高度计算错误