ios - inside - UICollectionView-La imagen se establece aleatoriamente
uicollectionview inside uitableviewcell (5)
Eso es porque reutilizas tu celular. Una opción sería tener una variable de diccionario para decir que su celda ha sido seleccionada y restablecer la imagen si no lo ha sido.
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"index %@",indexPath);
UICollectionViewCell *cell = [collection cellForItemAtIndexPath:indexPath];
cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];
[selectedDictionary setObject:[NSNumber numberWithBool:YES] forKey:[NSNumber numberWithInteger:indexPath.row]];
}
Luego, en su método cellForItemAtIndexPath verificaría ese valor
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
forIndexPath:indexPath];
BOOL selected = [[selectedDictionary objectForKey:[NSNumber numberWithInteger:indexPath.row]] boolValue];
if(selected){
cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];
}else{
cell.backgroundView = nil;
}
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
Por supuesto, si utiliza algún tipo de objeto como modelo, debería tener una variable seleccionada aquí, ya no necesitará un diccionario.
Estoy usando collectionView en mi aplicación. Estoy configurando la imagen para la celda backgroundView en didSelect delegate. Pero cuando selecciono un indexPath de celda, la imagen se establece para 3 cell indexPath. Cuando me desplazo por la colección ¿Las imágenes cambian aleatoriamente? Por favor, ayúdame. gracias por adelantado.
- (void)viewDidLoad
{
[super viewDidLoad];
[collection registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:uio];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection: (NSInteger)section
{
return 50;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"index %@",indexPath);
UICollectionViewCell *cell = [collection cellForItemAtIndexPath:indexPath];
cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];
}
Lo que sucede es que UICollectionView reutiliza las celdas. Entonces en didSelectItemAtIndexPath: estableces el fondo de la celda, pero luego UICollectionView reutiliza esa misma celda según sea necesario (y no estás restableciendo el cell.backgroundView en cellForItemAtIndexPath :).
La forma de solucionar esto es mantener un NSIndexSet de celdas seleccionadas. En didSelectItemAtIndexPath: puede agregar el índice del artículo que se seleccionó y forzar una recarga de ese artículo llamando a reloadItemsAtIndexPaths. Luego, en su cellForItemAtIndexPath: verifique el conjunto de índices para ver si el índice seleccionado está incluido y, de ser así, configure la vista de fondo de la celda.
Your -collectionView:didSelectItemAtPath:
está agregando una nueva vista de imagen a la celda. Nada elimina esa vista de imagen cuando la celda se reutiliza. Entonces, cuando dices:
UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
forIndexPath: indexPath];
en su -collectionView:cellForItemAtIndexPath:
puede recuperar alguna celda que ya tenga una o más vistas de imagen.
Mi sugerencia sería agregar la vista de la imagen a la celda en el prototipo de la celda, tal vez en su guión gráfico o en el inicializador de la celda. Tenga su -collectionView:cellForItemAtIndexPath:
configure la imagen para esa vista de imagen a la imagen correcta para la ruta dada.
El problema es dequeueReusableCellWithReuseIdentifier
.
Cuando se desplaza UICollectionview
, se reutilizan las celdas, es un problema agregar Collectionview
dentro de scrollview
.
Prueba esto adentro:
Scroll_View es tu vista de desplazamiento
la colección es su colección
-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
self.Scroll_View.contentSize = CGSizeMake(self.view.frame.size.width, collectionView.contentSize.height);
CGRect fram_For_Collection_View = self.collection_view.frame;
fram_For_Collection_View.size.height = collectionView.contentSize.height;
self.collection.view.frame = fram_For_Collection_View;
}
Tuve el mismo problema hace unos días y publiqué una pregunta aquí. Aquí está la respuesta que obtuve y funciona para mí.
Vista de colección Elemento múltiple de celda Seleccione Error
Y también, si está utilizando una celda personalizada, puede agregar este código al método init
de esa celda y también funcionará.
CGFloat borderWidth = 6.0f;
UIView *bgView = [[UIView alloc] initWithFrame:frame];
bgView.layer.borderColor = [UIColor redColor].CGColor;
bgView.layer.borderWidth = borderWidth;
self.selectedBackgroundView = bgView;