框架没有正确更新 UICollectionView 作为 UITableViewCell 子视图

Posted

技术标签:

【中文标题】框架没有正确更新 UICollectionView 作为 UITableViewCell 子视图【英文标题】:Frame is not updating properly for UICollectionView as UITableViewCell Subview 【发布时间】:2020-01-22 06:55:48 【问题描述】:

我将UICollectionView 放入自定义UITableViewUICollectionView 框架设置为 contentView 边界,但它并没有完全采用它。

CellForRowAtIndexPath

if indexPath.row == 0 
    let cell = tableView.dequeueReusableCell(withIdentifier: "collectionViewCell") as! TravelTypeTableViewCell
    cell.backgroundColor = .green
    return cell
 else 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
    cell.textLabel?.text = "adsf"
    return cell

TableViewCell

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    let layout = UICollectionViewFlowLayout()
    collectionView = UICollectionView(frame: self.contentView.bounds, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
    collectionView.backgroundColor = .clear
    self.addSubview(collectionView)

    collectionView.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant:0).isActive = true
    collectionView.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant:0).isActive = true
    collectionView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant:0).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant:0).isActive = true

输出界面

【问题讨论】:

【参考方案1】:

如果您使用约束,则不需要为集合视图提供框架。

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) // no need to give frame as you are adding constraints
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
    collectionView.backgroundColor = .clear
    self.contentView.addSubview(collectionView)


    collectionView.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant:0).isActive = true
    collectionView.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant:0).isActive = true
    collectionView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant:0).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant:0).isActive = true


【讨论】:

如果没有添加,还要添加 collectionView.translatesAutoresizingMaskIntoConstraints = false 崩溃 """ 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'UICollectionView 必须使用非零布局参数初始化'

以上是关于框架没有正确更新 UICollectionView 作为 UITableViewCell 子视图的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 包装器视图框架更新

UICollectionView 在帧更改后错误地显示单元格

如何从 UICollectionView 中正确删除单元格?

UICollectionView 拖放更新所有受影响的 indexPaths

根据内容更新 UICollectionView 高度

UICollectionView 没有正确滚动