ширина ячейки collectionView не меняется для разных перьев - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть представление коллекции, которое вложено в ячейку табличного представления.Первая ячейка в представлении коллекции - кнопка, которая позволяет пользователям создавать новый список.Его ширина меньше ширины ячеек основного списка.Недавно я изменил код так, чтобы методы collectionView делегата и dataSource находились в tableViewController вместо ячейки табличного представления, однако теперь ширина первых ячеек не меняется, как это было до перемещения кода.Это изображение показывает:

enter image description here

Если я нажимаю в пустое пространство, это регистрирует, что я нажал на плюсовую ячейку.

Код для всех методов делегата collectionView и источника данных data:

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 размер ячейки и ничего не изменится ни в одной ячейке

методы табличного представления, которые находятся в классе 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 не меняет размер?Спасибо

1 Ответ

0 голосов
/ 13 декабря 2018

Вы забыли добавить этот протокол: 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)
}
...