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