繁体   English   中英

不同笔尖的 collectionView 单元格宽度不会改变

[英]collectionView cell width not changing for different nib

我有一个嵌套在表格视图单元格内的集合视图。 集合视图中的第一个单元格是一个按钮,允许用户创建新列表。 它的宽度小于主列表单元格的宽度。 我最近更改了代码,以便 collectionView 委托和 dataSource 方法位于 tableViewController 而不是表格视图单元格中,但是现在第一个单元格宽度没有像移动代码之前那样改变。 此图显示:

在此处输入图片说明

如果我按下空白区域,它会注册我单击了加号单元格。

所有 collectionView 委托和 dataSource 方法的代码:

extension ProfileTableViewController: UICollectionViewDelegate, UICollectionViewDataSource {

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    print("the media: \(usersLists.count)")
    return usersLists.count + 1
}

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

    if indexPath.item == 0 {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "addNewListCell", for: indexPath) as! addNewListCell

        cell.currentUser = currentUser

        return cell

    }else{

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "listCell", for: indexPath) as! userListsCell

        cell.layer.applySketchShadow()
        cell.layer.cornerRadius = 20
        cell.layer.masksToBounds = false

        cell.currentUser = currentUser
        cell.media = usersLists[indexPath.item-1]

        return cell
    }

}



func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
    if indexPath.item == 0 {

        let size = CGSize(width: 80, height: 158)
        return size

    }else{

        let size = CGSize(width: 158, height: 158)
        return size

    }
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    if indexPath.item == 0 {
        //button
        self.addListDelegate?.addNewItem()
    }
}

我测试了更改sizeForItemAt中大小的任何值sizeForItemAt会改变单元格大小,并且任何单元格中都没有任何变化

ProfileTableViewController 类中的表视图方法,而不是扩展名:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "profileCell", for: indexPath) as! profileCell

    cell.selectionStyle = .none

    return cell

}

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    guard let tableViewCell = cell as? profileCell else { return }

    tableViewCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) //this line sets the collectionView delegate and datasouce so that I can have all of the collectionView methods in this class

}

这是 tableViewCell 里面的代码

protocol addListCollectionDelegate: class {
    func addNewItem()
}

class profileCell: UITableViewCell, UICollectionViewDelegate {    

    @IBOutlet weak var collectionView: UICollectionView!

    override func awakeFromNib() {
        super.awakeFromNib()

        collectionView.register(UINib(nibName: "usersLists", bundle: nil), forCellWithReuseIdentifier: "listCell")
        collectionView.register(UINib(nibName: "newListCell", bundle: nil), forCellWithReuseIdentifier: "addNewListCell")

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func setCollectionViewDataSourceDelegate
        <D: UICollectionViewDataSource & UICollectionViewDelegate>
        (dataSourceDelegate: D, forRow row: Int) {

        collectionView.delegate = dataSourceDelegate
        collectionView.dataSource = dataSourceDelegate
        collectionView.reloadData()
    }

}

有谁知道如何更改第一个单元格的宽度,因为sizeForItemAt没有改变大小? 谢谢

你忘了添加这个协议: UICollectionViewDelegateFlowLayout

当您想返回商品的自定义尺寸时需要它。

还要改进您的代码,如下所示:

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

    if indexPath.item == 0 {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "addNewListCell", for: indexPath) as! addNewListCell
        cell.currentUser = currentUser
        return cell
    }

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "listCell", for: indexPath) as! userListsCell
    cell.layer.applySketchShadow() // Write this line in cell class
    cell.layer.cornerRadius = 20 // Write this line in cell class
    cell.layer.masksToBounds = false // Write this line in cell class
    cell.currentUser = currentUser
    cell.media = usersLists[indexPath.item - 1]
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
    return indexPath.item == 0 ? CGSize(width: 80, height: 158) : CGSize(width: 158, height: 158)
}

尝试使用 UICollectionViewDelegateFlowLayout 方法。 在 Xcode 11 或更高版本中,您需要将 Xib 的 Estimate Size 设置为 none。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
   let padding: CGFloat =  170
   let collectionViewSize = advertCollectionView.frame.size.width - padding
   return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM