Sener
Sener

Reputation: 129

UiCollectionView cell dynamic width

I have a UICollectionView. How can I set the cell width = label width programmatically

I have implemented UICollectionViewDelegateFlowLayout and UICollectionViewDataSource.

 let musicType = ["Blues", "Klasik Müzik", "Halk Müzikleri", "Hip-hop", "Caz", "Pop", "Rock", " Enstrümantal Müzik", "House", "Rap" , "Slow"]

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return musicType.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCellIdentifier, for: indexPath as IndexPath) as! CustomCell
        cell.nameLabel.text = musicType[indexPath.item]
        cell.sizeToFit()
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        ?????
    }



}

class CustomCell: UICollectionViewCell {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    let nameLabel: UILabel = {
       let lbl = UILabel()
        lbl.text = "deneme Tag"
        lbl.translatesAutoresizingMaskIntoConstraints = false
        return lbl
    }()


    func setupView(){
        backgroundColor = UIColor.red
        addSubview(nameLabel)
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[v0]-10-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel]))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel]))
    }

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




}

Upvotes: 1

Views: 3567

Answers (1)

Josh Homann
Josh Homann

Reputation: 16327

You need to get the attributes for the label then create an NSAttributedString with the data for the give index path. NSAttributedString has a size method which will tell you how big the text should be.

It looks like your label has no attributes and no data so assuming you want the cell to be the actual size of your label with zero padding its:

let text = NSAttributedString(string: "deneme Tag")
return text.size()

Upvotes: 1

Related Questions