Pregunta

Tengo dos secciones en UICollectionView.Quiero mostrar un encabezado de sección en UICollectionView sólo 1 de la sección.No en 0 sección.

Así que traté de volver nil en viewForSupplementaryElementOfKind:método para section == 0 y vuelve a la vista de la section == 1.

Se bloquea y muestra el siguiente mensaje de error:

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

Aquí está mi código para el complementario de vista.

- (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;
}

He encontrado que devolver nil en viewForSupplementaryElementOfKind: método de estrellarse para los demás también.Otras respuestas que sugieren para eliminar ese método.

Pero quiero mostrar encabezado de sección para secciones específicas solamente.Cómo lograr que el regresar a la vista de una sección?Gracias.Cualquier ayuda se agradece.

EDITAR:

Como @san dijo, he actualizado el código para ocultar el encabezado de la sección.Funciona.Se esconde el encabezado.Pero todavía estoy viendo el espacio vacío en el lugar de la cabecera de la sección.Los resultados esperados no debe haber ningún espacio para la sección de encabezado, si está oculto.

código actualizado:

- (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;
}

Incluso traté de establecer el marco para sectionHeader como @san dijo.Pero no hubo suerte.mismo resultado.

¿Fue útil?

Solución

Por fin, encontré una respuesta para mi pregunta.Me he perdido algo.De todos modos lo siento por otros usuarios.

Establece la altura y el ancho del encabezado dentro del método de abajo hasta ahora, como dijo @san.

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

Pero no es el método correcto configurar el tamaño del marco de las vistas complementarias.Más tarde, encontré otro método dentro del flujo de flujo, lo que me ayuda a configurar los tamaños de encabezado y pie de página.

Esto realmente funciona bien para mí:

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

Actualizar: Dado que alguien cuestionó sobre mi habilidad en los comentarios, adjuntando Apple Enlace de documentación para devolver cgsizezero en el método anterior.

Otros consejos

La documentación para collectionView:viewForSupplementaryElementOfKind:atIndexPath: estados:

Este método debe devolver siempre válida del objeto de la vista.Si usted no desea complementario de vista en un caso particular, de su objeto de diseño no debe crear los atributos para esa vista.Alternativamente, usted puede ocultar la vista por la configuración de la propiedad oculto de los atributos correspondientes para SÍ o establezca la propiedad alpha de los atributos a 0.Para ocultar el encabezado y pie de página vistas en un diseño de flujo, también puede establecer el ancho y la altura de esos puntos de vista a 0.

Teniendo en cuenta que ya han probado el ajuste de la altura a cero y ajuste el punto de vista oculto, debe subclase UICollectionViewFlowLayout y aplicar layoutAttributesForSupplementaryViewOfKind:atIndexPath:

Compruebe la indexPath (como ya lo hace) y volver nil si usted no desea que cualquier diseño de atributos que el complementario de vista.

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

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

Documentación dice claramente -

Valor de retorno

Un objeto de vista complementario configurado.No debe devolver a nil de este método.

para que necesite seguir -

Este método siempre debe devolver un objeto VER VET válido.Si no desea una vista complementaria en un caso particular, su objeto de diseño no debe crear los atributos para esa vista.Alternativamente, puede ocultar vistas configurando la propiedad oculta de los atributos correspondientes a sí o configure la propiedad alfa de los atributos a 0. Para ocultar las vistas de encabezado y pie de página en un diseño de flujo, también puede configurar el ancho y la altura de esas vistas.a 0.

Al venir a su código, a continuación, el fragmento debe funcionar para usted:

- (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;
}

En mi caso, he dado inserción a las secciones, así que me estaba dando espacio vacío. Entonces, si ha implementado el siguiente método, hágalo en la siguiente manera

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)
        }
    }

Puede ocultar / mostrar su sección de encabezado reutilizable agregando delegado de UICollectionViewDelegateFlowLayout y use el código inferior

- (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;
}
}

para que pueda ocultarlo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top