以编程方式声明的 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 内对齐 UILabel 大小
在以编程方式创建的 UICollectionView 中未调用 didDeselectItemAtIndexPath 函数