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 UICollectionViews molte volte, ma nulla sembra aiutare.Qualche idea?

È stato utile?

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:
.

Vedi qui: https://developer.apple.com/Library/ios/osdocumentation/uikit/reference/uicollectionvision viewLayout_class/reference/reference.html#//apple_ref/occ/cl/uticollectionViewLayout

.

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>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top