2014-07-03 12 views

risposta

30

è possibile utilizzare il metodo della UICollectionViewDelegateFlowLayoutcollectionView:layout:referenceSizeForHeaderInSection: e tornare CGSizeMake(0,0) o impostare di conseguenza il headerReferenceSize di UICollectionViewFlowLayout.

Edit: headerReferenceSize è in realtà la proprietà che utilizza storyboard per mostrare/nascondere le intestazioni. Ho aggiunto le linee interessate dal file Storyboard

con checkbox sezione su:

<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="xAt-Uo-bMl"> 
      <size key="headerReferenceSize" width="50" height="50"/></collectionViewFlowLayout> 

Con la sezione casella off

<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="xAt-Uo-bMl"> 
      <size key="headerReferenceSize" width="0" height="0"/></collectionViewFlowLayout> 

Modifica # 2 :

Da the official docs:

Ogni sezione in un layout di flusso può avere la propria intestazione e piè di pagina personalizzato. Per configurare l'intestazione o il piè di pagina per una vista, è necessario configurare la dimensione dell'intestazione o del piè di pagina in modo che sia diverso da zero. È possibile farlo implementando i metodi di delega appropriati o assegnando valori appropriati alle proprietà headerReferenceSize e footerReferenceSize. Se la dimensione dell'intestazione o del piè di pagina è 0, la vista corrispondente non viene aggiunta alla vista raccolta.

+0

Il problema che ho è che cambio dinamicamente la dimensione del footer. Cambio footerReferenceSize in - (UICollectionReusableView *) collectionView: (UICollectionView *) collectionView viewForSupplementaryElementOfKind: (NSString *) kind inIndexPath: (NSIndexPath *) indexPath e lo rende efficace tramite [self.collectionview performBatchUpdates:^{ // change footerRefernceSize di il completamento del layout }:^(BOOL terminato) { }]; non funziona, visualizza ancora il valore iniziale restituito da collectionViewLayout referenceSizeForFooterInSection: (NSInteger) sezione – Hammer

+0

Incredibile che si tratti di una casella di controllo nello storyboard, ma si imposta un'altezza nel codice. Questo non dipende da me. Oh bene, questo ha corretto il mio problema, che è stato non impostare un'origine per CollectionView fino a un metodo asincrono dopo ViewDidLoad. Funziona bene nella maggior parte delle raccolte, ma una con SupplementaryViews non lo consente, quindi li ho disabilitati dallo storyboard ma li ho impostati dopo aver impostato la sorgente. – Chucky

-1

quando semplicemente non si vuole un header di apparire, nel del delegato

viewForSupplementaryElementOfKind 

Proprio return [UIView new]; quando kind == UICollectionElementKindSectionHeader:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
{ 
    if (kind == UICollectionElementKindSectionHeader) { 
     return [UIView new]; // Or even nil, I think it would work. 
    } 
    ... 
    return /*something else that you want to return*/ ; 
} 
+0

Grazie. Ma c'è un modo per disabilitare completamente le intestazioni? Come nel designer di Storyboard? Cosa succede realmente quando le intestazioni sono disabilitate nel designer. – Xyand

+0

Questo è solo un riferimento, penso. Sono sempre riuscito a non implementare i metodi dell'origine dati/delegare se non volevo intestazioni o implementandole se lo volevo. Davvero non penso che ci sia una proprietà pubblica reale che puoi impostare per quello. –

+1

E se non si desidera alcuna sezione, è possibile anche restituire 0 nel metodo numberOfSectionsInCollectionView: –

9

Basta modificare l'altezza a 0 delle intestazioni che non si desidera mostrare ...

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section 
{ 
    if (section == 0) { 
     return CGSizeZero; 
    }else { 
     return CGSizeMake(collectionView.frame.size.width,50); 
    } 
} 
+0

In che modo è diverso dalla risposta accettata? – Xyand

+0

Questo codice non verrà nemmeno compilato - restituisce 50; non è una taglia – fatuhoku

0

C'è una proprietà denominata "isHidden" e può essere utilizzato per nascondere l'intestazione della sezione quando non è necessaria.

facendo riferimento al seguente codice:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
    var reusableView : UICollectionReusableView! 
    if (kind == UICollectionElementKindSectionHeader) { 
     let cell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderCell", for: indexPath) as! CVHeader 
     let arrayData = summary[indexPath.section] 
     cell.headerLabel.text = arrayData.first as? String 
     if cell.headerLabel.text == "" { 
      cell.isHidden = true //this will hide the header and leave a blank space. 
     } 
     reusableView = cell 
    } 
    if (kind == UICollectionElementKindSectionFooter) { 
     reusableView = nil 
    } 

    return reusableView 
} 

Il codice nasconde sopra l'intestazione di sezione se il testo è vuota. Funziona perfettamente su xcode8.

Problemi correlati