Domanda

Ho due sezioni in UICollectionView. Voglio mostrare un'intestazione di sezione in UICollectionView per solo la prima sezione. Non in 0a sezione.

Così ho provato a tornare nil in viewForSupplementaryElementOfKind: Metodo per section == 0 e restituisce la visualizzazione per il section == 1.

Si blocca e mostra sotto Errore:

Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes]:
.

Qui è il mio codice per la vista supplementare.

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *sectionHeader = nil;
    if (kind == UICollectionElementKindSectionHeader && indexPath.section == 1) {
        sectionHeader = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"EventSectionHeader" forIndexPath:indexPath];
        sectionHeader.layer.borderWidth = .5f;
        sectionHeader.layer.borderColor = [UIColor colorWithRed:221.0 / 255.0 green:223.0 / 255.0 blue:220.0 / 255.0 alpha:1.0].CGColor;
    }

    return sectionHeader;
}
.

Ho trovato che restituire Nil nel metodo viewForSupplementaryElementOfKind: si schianta anche per gli altri. Altre risposte che suggeriscono di rimuovere quel metodo.

Ma voglio mostrare l'intestazione della sezione solo per sezioni specifiche. Come ottenere quella vista di ritorno per una sola sezione? Grazie. Qualsiasi aiuto sarebbe apprezzato.

Modifica:

AS @san ha detto, ho aggiornato il codice per nascondere l'intestazione della sezione. Funziona. Nasconde l'intestazione. Ma sto ancora vedendo lo spazio vuoto nel posto della sezione intestazione. I risultati attesi non dovrebbero esserci spazio per l'intestazione della sezione, se è nascosto.

Codice aggiornato:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{

    UICollectionReusableView *sectionHeader = nil;
    if (kind == UICollectionElementKindSectionHeader) {
        sectionHeader = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"EventSectionHeader" forIndexPath:indexPath];
        sectionHeader.layer.borderWidth = .5f;
        sectionHeader.layer.borderColor = [UIColor colorWithRed:221.0 / 255.0 green:223.0 / 255.0 blue:220.0 / 255.0 alpha:1.0].CGColor;
        if (indexPath.section == 0) {
            sectionHeader.hidden = YES;

        }else {
            sectionHeader.hidden = NO;
        }
    }

    return sectionHeader;
}
.

Ho persino provato a impostare il telaio per SectionHeader come ha detto @san. Ma senza fortuna. stesso risultato.

È stato utile?

Soluzione

Alla fine, ho trovato una risposta per la mia domanda.Ho perso qualcosa.Comunque mi dispiace per gli altri compagni di utenti.

Ho impostato l'altezza dell'intestazione e la larghezza all'interno del metodo sotto fino ad ora come ha detto @san.

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
.

Ma non è il metodo corretto per impostare la dimensione del fotogramma delle viste supplementari.Più tardi ho trovato un altro metodo all'interno del flusso flowlayout, che mi aiuta a impostare le taglie di intestazione e piè di pagina.

Questo funziona davvero bene per me:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return CGSizeZero;
    }else {
        return CGSizeMake(CGRectGetWidth(collectionView.bounds), 135);
    }
}
.

Aggiornamento: Dal momento che qualcuno ha interrogato sulla mia abilità nei commenti, attaccando Apple link di documentazione per tornare CGSizezero nel metodo sopra.

Altri suggerimenti

La documentazione per collectionView:viewForSupplementaryElementOfKind:atIndexPath: afferma:

.

Questo metodo deve sempre restituire un oggetto View valido.Se non si desidera una vista supplementare in un caso particolare, il tuo oggetto Layout non deve creare gli attributi per quella vista.In alternativa, è possibile nascondere le viste impostando la proprietà nascosta degli attributi corrispondenti su YES o impostare la proprietà Alpha degli attributi su 0. Per nascondere le viste di intestazione e piè di pagina in un layout di flusso, è possibile impostare anche la larghezza e l'altezza di quelle visualizzazionia 0.

Considerando di aver già provato a impostare l'altezza a zero e impostando la vista per essere nascosta, è necessario sottoclasse UICollectionViewFlowLayout e implementare layoutAttributesForSupplementaryViewOfKind:atIndexPath:

Controllare l'indicePath (come già eseguito) e restituisce nil se non si desidera che nessun attributo di layout per quella specifica vista supplementare.

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath section] == 0)
    {
         return nil;
    }

    return [super layoutAttributesForSupplementaryViewOfKind:kind atIndexPath:indexPath];
}
.

Documentazione dice chiaramente -

.

Valore di ritorno

Un oggetto di visualizzazione supplementare configurato.Non devi restituire NIL da questo metodo.

Quindi è necessario seguire -

.

Questo metodo deve sempre restituire un oggetto View valido.Se non si desidera una vista supplementare in un caso particolare, il tuo oggetto Layout non deve creare gli attributi per quella vista.In alternativa, è possibile nascondere le viste impostando la proprietà nascosta degli attributi corrispondenti su YES o impostare la proprietà Alpha degli attributi su 0. Per nascondere le viste di intestazione e piè di pagina in un layout di flusso, è possibile impostare anche la larghezza e l'altezza di quelle visualizzazionia 0.

Venendo al tuo codice, sotto Snippet dovrebbe funzionare per te:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *sectionHeader = nil;
    if (kind == UICollectionElementKindSectionHeader) {
        sectionHeader = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"EventSectionHeader" forIndexPath:indexPath];

        if(indexPath.section == 1)
          {
             sectionHeader.layer.borderWidth = .5f;
             sectionHeader.layer.borderColor = [UIColor colorWithRed:221.0 / 255.0 green:223.0 / 255.0 blue:220.0 / 255.0 alpha:1.0].CGColor;
          }
        else
        {
          sectionHeader.frame = CGRectZero;
          sectionHeader.hidden = YES;
        }
    }

    return sectionHeader;
}
.

Nel mio caso ho dato inserto alle sezioni, quindi mi stava dando spazio vuoto Quindi se hai implementato il seguente metodo, fallo in modo sotto il modo

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        if <condition for which you want to hide section>{
            return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        }else{
            return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        }
    }
.

È possibile nascondere / visualizzare la tua sezione intestazione riutilizzabile aggiungendo delegato UICollectionViewDelegateFlowLayout e utilizzando sotto il codice

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
if (self.isForSearch) { //---> for hiding
    return CGSizeMake(0,0);
}
else{//---> for showing
    return ((UICollectionViewFlowLayout*)self.collectionChoosePlanView.collectionViewLayout).headerReferenceSize;
}
}
.

Quindi puoi nasconderlo / mostrarlo

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