Set collectieBekijk grootte. (sizeForItemAtIndexPath-functie werkt niet) Swift 3

Ik heb een tableViewen in elke tableViewCellzit een collectionView.

Ik probeer de collectionView-grootte te wijzigen met deze code:

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    if collectionView.tag == 2{
        return CGSize(width: 100, height: 100)
    }else if collectionView.tag == 4 {
        return CGSize(width: 222, height: 200)
    }else{
        return CGSize(width: 10, height: 10)
    }
}

Het probleem is dat er geen fout is, maar cellen veranderen niet van grootte

Als je iets meer wilt weten, schrijf dan gewoon een opmerking.

Bedankt.


Antwoord 1, autoriteit 100%

Vergeet ten eerste niet om uit te breiden van UICollectionViewDelegateFlowLayoutafgevaardigde.

Voor weergavelogica voor één collectieweergave:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = ((collectionView.frame.width - 15) / 2) // 15 because of paddings
    print("cell width : \(width)")
    return CGSize(width: width, height: 200)
}

En een belangrijk punt in het storyboard, vergeet de geschatte grootte niet: geen

estimate_size_none


Antwoord 2, autoriteit 24%

De handtekening voor deze methode is in Swift 3 gewijzigd in:

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    // your code here
}

Let op het subtiele verschil: (_ collectionView: ...in plaats van (collectionView: ....

Dit komt omdat je in Swift 3 expliciet het label van de eerste parameter moet specificeren. U kunt dit standaardgedrag overschrijven door het onderstrepingsteken _toe te voegen.

Zorg er ook voor dat uw klas de protocollen UICollectionViewDelegateen UICollectionViewDelegateFlowLayoutgebruikt

class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
    // your code here
    func collectionView(_ collectionView: UICollectionView,
                layout collectionViewLayout: UICollectionViewLayout,
                sizeForItemAt indexPath: IndexPath) -> CGSize {
        // your code here
    }
}

Raadpleeg deze linkvoor meer informatie over wijzigingen in Swift 3.


Antwoord 3, autoriteit 8%

U moet specificeren dat u het protocol UICollectionViewDelegateFlowLayout implementeert in uw klassendeclaratie.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout

Antwoord 4

Dus dit is mijn code op dit moment en het werkt:

       collectionView.delegate = dataSourceDelegate
        collectionView.dataSource = dataSourceDelegate
        collectionView.tag = row
        collectionView.setContentOffset(collectionView.contentOffset, animated:false)
        collectionView.reloadData()
        collectionView.register(UINib(nibName: "eventsCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "eventsCollectionViewCell")
        if row == 2{
            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            layout.itemSize = CGSize(width: 120, height: 120)
            layout.scrollDirection = .horizontal
            collectionView.collectionViewLayout = layout
        }else if row == 4 {
            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            layout.itemSize = CGSize(width: 222, height: 200)
            layout.scrollDirection = .horizontal
            collectionView.collectionViewLayout = layout
        }else{
            print("else")
        }

Antwoord 5

Korte versie:

Probeer

. toe te voegen

collectionView.delegate = dataSource

Langere versie:

Voor mij was dit een kleine fout –

collectionView.dataSource = self

Dit zou deze methoden noemen

func numberOfSections(in collectionView: UICollectionView) -> Int
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

Het zou echter NIETbellen

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

Omdat dit geen onderdeel is van de dataSource van UICollectionView. Het maakt deel uit van de afgevaardigde van UICollectionView.

Dus het toevoegen van het volgende loste mijn probleem op.

collectionView.delegate = dataSource

Antwoord 6

Ik heb hetzelfde probleem gehad! Als je de maat de helft van de breedte maakt (breedte/2), dan zal het nog steeds lijken op de hele breedte omdat de opvulling wordt toegevoegd aan de breedte/2.

Oplossing: zorg ervoor dat u de sectie-inzetstukken in Storyboard instelt op 0. U kunt de breedte/2 ook aanpassen aan een grootte die de sectie-inzetstukken BEVAT.

Het kostte me een tijdje om dat te repareren 😉


Antwoord 7

Vergeet niet om UICollectionViewFlowLayout-object toe te wijzen aan uw collectionViewLayoutaangezien UICollectionView standaard UICollectionViewLayout (niet UICollectionViewFlowLayout) gebruikt.

p>

let flowLayout = UICollectionViewFlowLayout()

collectionView.collectionViewLayout = flowLayout

Other episodes