ios - uicollectionviewcontroller - Vistas compatibles de UICollectionView Header
uicollectionviewcell indexpath (1)
No soy capaz de reproducir el problema del guión gráfico, funciona bien para mí cuando agrego el control segmentado arrastrándolo directamente en el guión gráfico (sin código). En cuanto a su forma alternativa de agregarlo mediante programación, el problema aquí es que cuando se inicializa una vista desde el guión gráfico (como es en este caso), se usa el método initWithFrame
(no el método initWithFrame
inicialización). Por lo tanto, si anula ese método, insertando el código allí, debería funcionar:
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if(self){
_segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]];
_segmentedControl.bounds = CGRectMake(0, 0, 100, 50);
[_segmentedControl addTarget:self action:@selector(segmentedControlChanged:) forControlEvents:UIControlEventValueChanged];
[self addSubview:_segmentedControl];
}
return self;
}
PD. No afecta este caso específico, pero debes hacer lo siguiente:
GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
en lugar de:
GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
Como es la vista de colección la que solicitará el tipo de vista correcto, ¡debe preocuparse por especificarla!
EDITAR: Los pasos que seguí para crear el encabezado del guión gráfico son:
- Seleccione la vista de colección y marque la casilla etiquetada como encabezado de sección
- Seleccione el encabezado recién creado y seleccione la clase correcta en el inspector de identidad
- Dale a la sección del encabezado un identificador único
- Arrastra los elementos de la interfaz de usuario en el encabezado del guión gráfico (también cambié el color de fondo)
- Finalmente, implemente el método
collectionView:viewForSupplementaryElementOfKind:atIndexPath:
en la clase de fuente de datos de la vista de colección
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath
{
return [self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionViewHeader" forIndexPath:indexPath];
}
¡Avíseme si puede ver la diferencia entre lo que hizo y lo que hice!
UICollectionView
un UICollectionView
en un guión gráfico e implementé todos los métodos de fuente de datos y delegar requeridos en el controlador de vista. En el guión gráfico, verifiqué la propiedad de Section Header
en la vista de colección y establecí la clase de la vista de encabezado en una subclase de UICollectionResusableView
(en el guión gráfico).
A partir de aquí, arrastré dos elementos de la interfaz de usuario en la vista de encabezado a través del guión gráfico: una etiqueta y un control segmentado:
Cuando se ejecuta el programa, la etiqueta aparece en la vista de encabezado de la vista de colección (sin código real requerido), pero el control segmentado no. Sin embargo, cuando se arrastra un control segmentado a una UIView
típica, se muestra y es manipulable sin necesidad de código. Incluso cuando se IBOutlet
una instancia a través de un código en una IBOutlet
, el control segmentado no aparece.
¿Por qué el control segmentado no está visible en el encabezado de la vista de colección mientras se encuentra en una UIView
típica, y por qué la etiqueta se muestra sin problemas?
ACTUALIZAR
Aquí está el método init para la vista de encabezado personalizado, en el que intenté agregar el control segmentado programáticamente (a diferencia de en el guión gráfico):
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]];
[_segmentedControl setFrame:CGRectMake(0, 0, 100, 50)];
[_segmentedControl addTarget:self action:@selector(segmentedControlChanged:) forControlEvents:UIControlEventValueChanged];
[self addSubview:_segmentedControl];
}
return self;
}
Como se solicitó, aquí está el método -[UICollectionReusableView viewForSupplementaryElementOfKind:]
en el controlador de vista principal:
- (UICollectionReusableView *)collectionView:(UICollectionView *)cv viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
return headerView;
}