以编程方式声明的 UICollectionView 不会更改 Swift 5 中单元格的大小

Posted

技术标签:

【中文标题】以编程方式声明的 UICollectionView 不会更改 Swift 5 中单元格的大小【英文标题】:Programmatically declared UICollectionView does not change the size of cell in Swift 5 【发布时间】:2020-05-28 03:38:11 【问题描述】:

我正在以编程方式声明UICollectionView 及其对应的单元格。写出原版设置后,我发现我无法配置单元格的大小。无论我是否放置逻辑或尺寸,单元格(红色)似乎都是一些默认的正方形(和小)大小。屏幕截图在这篇文章的末尾。

供参考,代码如下:

setupView()
    // collection view for screens
    let screenHeight : CGFloat = CGFloat(height/6)
    let screenWidth = screenHeight * ( width/height )
    let offset_top_screens : CGFloat = height - rowHeight - screenHeight

    let screenRow = UICollectionView(
          frame: CGRect(x: 0, y: offset_top_screens, width: width, height: screenHeight)
        , collectionViewLayout: UICollectionViewFlowLayout()
    )

    //screenRow.translatesAutoresizingMaskIntoConstraints = false

    screenRow.backgroundColor = Color.grayTertiary

    // set up collection view delegates
    screenRow.dataSource = self
    screenRow.alwaysBounceHorizontal = true

    screenRow.register(ScreenItem.self, forCellWithReuseIdentifier: ScreenItem.identifier) // register w/ storyboard

    self.view.addSubview(screenRow)
    self.screenRow = screenRow
    self.view.bringSubviewToFront(screenRow)
    self.screenHeight = screenHeight
    self.screenWidth  = screenWidth
    // end collection view screen




func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return dataSource.count


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    let row = indexPath.row
    let user = self.dataSource[row]
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ScreenItem", for: indexPath) as! ScreenItem

    /*
     cell.uuid        = user.uuid
     cell.delegate    = self
     cell.mediaSource = ... what is the pipe here?
     */
    return cell



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

    return CGSize(width: 45, height:40)  // changing these values do not change anything
    // return CGSize(width: 90, height: collectionView.bounds.height)   <- this does nothing





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


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


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




// somewhere in a different file


/*
 @Use: display user's screen
 */
class ScreenItem: UICollectionViewCell 

    static var identifier: String = "ScreenItem"

    weak var textLabel: UILabel!

    override init(frame: CGRect) 
        super.init(frame: frame)
        self.backgroundColor = Color.red
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    override func prepareForReuse() 
        super.prepareForReuse()
        self.reset()
    

    func reset() 
        // @TOOD: reset things here
    

__更新__父类定义

class CallController:
  UIViewController
, UICollectionViewDataSource
, UICollectionViewDelegate

【问题讨论】:

【参考方案1】:

您似乎没有设置委托。如果您使用的是UICollectionViewFlowLayout,那么您的UIViewController 应该实现UICollectionViewDelegateFlowLayout 协议。

UICollectionViewDelegateFlowLayout

您的UIViewController 实例是否已实现此协议?您是否设置了delegate 属性?

【讨论】:

我实现了 UICollectionViewDataSource 和 UICollectionViewDelegate。 好的,明白了。我不小心删除了 collectionview.delegate =self 位。但是现在集合视图可以垂直和水平滚动......这里禁用垂直滚动的设置是什么?

以上是关于以编程方式声明的 UICollectionView 不会更改 Swift 5 中单元格的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式快速创建 uicollectionview(没有情节提要)

以编程方式创建 UICollectionView

以编程方式在 UICollectionView 内对齐 UILabel 大小

在以编程方式创建的 UICollectionView 中未调用 didDeselectItemAtIndexPath 函数

以编程方式选择尚未加载的 UICollectionView 单元格

以编程方式添加 UICollectionView 时应用程序崩溃