Ik heb een tableView
en in elke tableViewCell
zit 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
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 UICollectionViewDelegate
en UICollectionViewDelegateFlowLayout
gebruikt
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