UicollectionView Intestazione non mostra
-
12-12-2019 - |
Domanda
Sto lavorando su un progetto che utilizza un UICollectionView
per mostrare diversi album.Gli articoli mostrano bene, ma ora voglio mostrare un'intestazione sopra la prima sezione.
Per fare ciò, ho aggiunto il registerNib:forSupplementaryViewOfKind:withReuseIdentifier:
al mio metodo di init.In questo modo:
[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier];
.
(il neb AlbumHeader
contiene una vista della classe AlbumHeader
, che è una sottoclasse di UICollectionView
.)
Dopo di ciò, ho implementato il metodo collectionView:viewForSupplementaryElementOfKind:atIndexPath
:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath];
}
.
Ora dovrebbe provare a caricare la vista dell'intestazione, suppongo.Ma non lo è, il metodo per la vista supplementare non viene chiamato.
Cosa mi manca?Bloccato per ore, hanno letto la documentazione su UICollectionView
s molte volte, ma nulla sembra aiutare.Qualche idea?
Soluzione
Dopo aver cercato il metodo che YUF ha chiesto, ho letto che per impostazione predefinita, la dimensione di intestazioni / piè di pagina è 0,0.Se la dimensione è 0, l'intestazione / piè di pagina non verrà visualizzata.
È possibile impostare le dimensioni con una proprietà:
flowLayout.headerReferenceSize = CGSizeMake(0, 100);
.
Allora tutte le intestazioni avranno le stesse dimensioni.Se deve essere diverso per ogni sezione, è possibile implementare il seguente metodo, che fa parte del protocollo UICollectionViewDelegateFlowLayout
.
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
if (section == albumSection) {
return CGSizeMake(0, 100);
}
return CGSizeZero;
}
.
Si noti che in uno scorrimento verticale utilizza il height
restituito e la larghezza completa della vista di raccolta, in uno scorrimento orizzontale utilizza il width
di ritorno e l'altezza completa della vista di raccolta.
Altri suggerimenti
Hai implementato:
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
.
C'è una tonnellata di metodi da implementare solo per far funzionare una cosa ... sto imparando anche io.Dimmi se funziona.
Modifica: Scusa metodo sbagliato.Questo è per la sottoclassamento, penso.Quello di cui sto parlando è in UICollectionViewLayout
(l'oggetto layout YouClass, se il tuo layout supporta le viste supplementari):
- layoutAttributesForSupplementaryViewOfKind:atIndexPath:
.
. per Swift 3 & Swift 4
self.collectionView.register(UINib(nibName: "SectionCollectionReusableView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "SectionCollectionReusableView")
self.collectionView.fs_width = self.collectionView.bounds.width
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 70, left: 40, bottom: 0, right: 0)
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
layout.estimatedItemSize = CGSize(width: 350, height: 140)
layout.scrollDirection = .horizontal
layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
layout.sectionHeadersPinToVisibleBounds = true
self.collectionView!.collectionViewLayout = layout
.
Devi aggiungere questo a ViewDidload e notare il
layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
.
Ciò renderà i layout della sezione dell'intestazione
E grazie @Guido Hendriks, e tutto ciò che ho avuto l'intuizione dalla sua risposta pure-/ p>