Try to search your question here, if you can't find : Ask Any Question Now ?

Expand and collapse the cells from the selected Section in UICollectionViewController

HomeCategory: stackoverflowExpand and collapse the cells from the selected Section in UICollectionViewController
Avatargaurav asked 4 months ago

I have been trying to collapse and expand the cells in collectionView when the section header is clicked but all the headers were expanding rather then the selected header.
This is my code

class ExampleHomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

var expandedRow: Bool = false
var section: Int!

let postCellId = "postCellId"
let headerCellId = "headerCellId"

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView.delegate = self
    collectionView.dataSource = self

    collectionView.backgroundColor = UIColor.init(r: 220, g: 214, b: 214)

    collectionView.register(PostCell.self, forCellWithReuseIdentifier: postCellId)
    collectionView.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerCellId)

}

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


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: postCellId, for: indexPath)
    return cell
}

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerCellId, for: indexPath) as! HeaderCell
    header.downArrowBtn.addTarget(self, action: #selector(showCells), for: .touchUpInside)
    return header

}

@objc func showCells() {
    if expandedRow == false {
        expandedRow = true
    }else {
        expandedRow = false
    }
    collectionView.reloadData()
}


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    if expandedRow == true {
        return CGSize(width: view.frame.width - 24, height: 280)
    } else {
        return CGSize(width: view.frame.width - 24, height: 0)
    }
}

}

And this is my Post Cell

class PostCell: UICollectionViewCell {
override init(frame: CGRect) {
    super.init(frame: frame)

    setupViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

let postImage: UIImageView = {
    let view = UIImageView()
    view.image = #imageLiteral(resourceName: "one")
    return view
}()


func setupViews() {

    backgroundColor = .white

    addSubview(postImage)

    postImage.anchor(top: contentView.topAnchor, leading: nil, bottom: contentView.bottomAnchor, trailing: nil, padding: .init(top: 20, left: 0, bottom: 0, right: 0), size: .init(width: 70, height: 0))
    postImage.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
}

}

And this is my HeaderCell

class HeaderCell: UICollectionViewCell  {

var expandedRow: Bool!

override init(frame: CGRect) {
    super.init(frame: frame)
    backgroundColor = UIColor.init(r: 220, g: 214, b: 214)
    setupViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

let headerImage: UIImageView = {
    let view = UIImageView()
    view.image = #imageLiteral(resourceName: "facebook")
    return view
}()

let headerLabel: UILabel = {
    let label = UILabel()
    label.text = "Posts By Network"
    return label
}()

let downArrowBtn: UIButton = {
    let button = UIButton()
    button.setImage(#imageLiteral(resourceName: "downarrow"), for: .normal)
    button.imageView?.contentMode = .scaleAspectFit
    return button
}()

func setupViews() { 
    addSubview(headerImage)
    addSubview(headerLabel)
    addSubview(downArrowBtn)

    headerImage.anchor(top: contentView.topAnchor, leading: contentView.leadingAnchor, bottom: nil, trailing: nil, padding: .init(top: 8, left: 12, bottom: 0, right: 0), size: .init(width: 30, height: 30))
    headerLabel.anchor(top: headerImage.topAnchor, leading: headerImage.trailingAnchor, bottom: nil, trailing: nil, padding: .init(top: 2, left: 20, bottom: 0, right: 0))
    headerLabel.centerYAnchor.constraint(equalTo: headerImage.centerYAnchor).isActive = true
    downArrowBtn.anchor(top: headerLabel.topAnchor, leading: headerLabel.trailingAnchor, bottom: nil, trailing: contentView.trailingAnchor, padding: .init(top: 0, left: 0, bottom: 0, right: 12), size: .init(width: 20, height: 20))

}

}

All the cells were expanding when header is clicked, but I want to expand and collapse only the selected section, How can I do this. I am new to swift and have been trying this for past few weeks.
Thank you

1 Answers
Best Answer
AvatarMannu answered 4 months ago
Your Answer

15 + 15 =

Popular Tags

WP Facebook Auto Publish Powered By : XYZScripts.com