uicollectionviewcontroller ios iphone ios7 uicollectionview uicollectionreusableview

ios - uicollectionviewcontroller - uicollectionviewcell swift



Eliminación de espacios vacíos, si el encabezado de la sección está oculto en UICollectionView (4)

La documentación dice claramente:

Valor de retorno

Un objeto de vista suplementaria configurado. No debes devolver nil con este método.

Así que necesitas seguir

Este método siempre debe devolver un objeto de vista 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 las vistas configurando la propiedad oculta de los atributos correspondientes en SÍ o establecer la propiedad alfa de los atributos en 0. Para ocultar las vistas de encabezado y pie de página en un diseño de flujo, también puede establecer el ancho y el alto de esas vistas a 0

Llegando a tu código, el siguiente fragmento de código debería funcionar para ti:

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

Tengo dos secciones en UICollectionView . Quiero mostrar un encabezado de sección en UICollectionView para solo la 1ª sección. No en la 0ª sección.

Así que traté de devolver nil en viewForSupplementaryElementOfKind : method for section == 0 y devuelve view para la section == 1 .

Se bloquea y muestra el siguiente error:

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

Aquí está mi código para la vista complementaria.

- (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 se bloquea para otros también. Otras respuestas que sugieren eliminar ese método.

Pero quiero mostrar el encabezado de sección solo para secciones específicas. ¿Cómo lograr esa vista de vuelta para una sola sección? Gracias. Cualquier ayuda sería apreciada.

EDITAR:

Como dijo @san, he actualizado el código para ocultar el encabezado de la sección. Funciona. Oculta el encabezado. Pero todavía estoy viendo el espacio vacío en el lugar del encabezado de la sección. Los resultados esperados es que no debería haber espacio para el encabezado de la sección, 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 intenté establecer el marco para sectionHeader como @san dijo. Pero no hay suerte. mismo resultado


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

Este método siempre debe devolver un objeto de vista 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 las vistas configurando la propiedad oculta de los atributos correspondientes en SÍ o establecer la propiedad alfa de los atributos en 0. Para ocultar las vistas de encabezado y pie de página en un diseño de flujo, también puede establecer el ancho y el alto de esas vistas a 0

Teniendo en cuenta que ya ha intentado establecer la altura en cero y la vista como oculta, debe subclase UICollectionViewFlowLayout e implementar layoutAttributesForSupplementaryViewOfKind:atIndexPath:

Compruebe el indexPath (como ya lo hizo) y devuelva nil si no desea ningún atributo de diseño para esa vista complementaria específica.

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


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

Establecí 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 para establecer el tamaño de marco de las vistas suplementarias. Más tarde, encontré otro método dentro de flowLayout, que me ayuda a establecer 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); } }

ACTUALIZACIÓN: desde que alguien cuestionó mi habilidad en los comentarios, adjunté el enlace a la documentación de Apple para devolver CGSizeZero en el método anterior.


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

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

Así que puedes ocultarlo / mostrarlo