Réutilisé les cellules dans un UICollectionView afficher plusieurs UIImageViews quand ils ne devraient afficher un
Im ayant un problème avec mon UICollectionView
. Initialement, il affiche fine, montrant une grille de cellules, chaque cellule avec un seul UIImageView
. Ces UIImageViews
montrent des Png avec de la transparence qui sont stockés dans l'application du bundle.
Mon problème est que, une fois la UICollectionView
a fait défiler, certaines cellules semblent être endommagé.
Une corruption de la cellule affiche plusieurs images empilées les unes sur les autres, le plus haut de l'image est celle qu'il doit être visible, et les images ci-dessous sont celles qui devraient être utilisés dans d'autres cellules.
Ma meilleure supposition est que cela a quelque chose à voir avec la façon dont les cellules à l'intérieur d'un UICollectionView
sont réutilisés, mais je suis ouvert aux suggestions.
C'est le délégué code que j'utilise pour la création de cellules au sein de la UICollectionView
:
//creates the individual cells to go in the menu view
- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
//create collection view cell
UICollectionViewCell * cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
//create a uiview where we can place all views that need to go into this cell
UIView * contents=[[UIView alloc] initWithFrame:cell.contentView.bounds];
[contents setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:contents];
//add a button image
NSString * buttonPath=[[NSBundle mainBundle] pathForResource:@"button" ofType:@"png" inDirectory:[[buttons objectAtIndex:indexPath.row] objectForKey:@"name"]];
UIImage * button=[UIImage imageWithContentsOfFile:buttonPath];
UIImageView * buttonView=[[UIImageView alloc] initWithImage:button];
[buttonView setContentMode:UIViewContentModeScaleAspectFit];
[buttonView setFrame:contents.bounds];
[contents addSubview:buttonView];
//set tag to the indexPath.row so we can access it later
[cell setTag:indexPath.row];
//add interactivity
UITapGestureRecognizer * tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onButtonTapped:)];
[tap setNumberOfTapsRequired:1];
[cell addGestureRecognizer:tap];
//return the cell
return cell;
}
Je peux fournir plus de code si nécessaire.
Comment puis-je empêcher les cellules de se corrompre?
- Vous avez raison, c'est exactement la façon dont vous réutilisez les Cellules. Parce que vous venez d'ajouter une couche après l'autre sur votre cellulaire avec le addSubview: les appels.
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous continuez à ajouter des vues de la
UICollectionViewCell
comme ils sont réutilisées automatiquement par leUICollectionView
. Alors le vieuxUIImageView
's toujours sur la cellule que vous ajoutez un de plus que lecellForItemAtIndexPath:
est appelé.NE PAS UTILISER
addSubview:
!Au lieu de cela, vous pourriez faire un de cellule personnalisé avec toutes les vues que vous voulez déjà en eux. De sorte que, lorsque le
cellForItemAtIndexPath:
est appelée, vous ne devez définir le contenu de ce CustomCollectionViewCell à la place.De cette façon, il sera certainement arrêter d'être endommagé.
Comment construire un CustomCell.
Etape 1: Créer l' .h & .m classe.
CustomCell.h
CustomCell.m
Etape 2: l'Importer!
Maintenant que nous avons créé le CustomCell on peut l'importer dans la classe, nous voulons l'utiliser.
Etape 3: Utilisation en action!
Etape 4: Inscrivez-vous à la cellule de la collectionView
dans le viewDidLoad /loadView ajouter cette ligne:
Etape 5: Profitez-En!
Votre CustomCell est fait. Maintenant faire ce que vous voulez et n'oubliez pas de faire un peu de café aussi.
cell.imageView=...
vous définissez la UIImageView dans la cellule personnalisé de classe à une UIImage - si cela n'a aucun sens?imageView
propriété de la cellule personnalisé - je pense que c'est avec cette ligneCustomCell *cell=[collectionView dequeueReusable...
- quand je NSLog qu'il me raconte son uneUICollectionViewCell
au lieu d'unCustomCell
UICollectionViewCell
et pas unCustomCell
...Juste après
Il suffit d'ajouter cette ligne,
Qui se produisent parce que vous l'ajouter à chaque fois un
UIImageView
à votre cellule pour résoudre ce problème, vous devez Faire un custom de la cellule et de l'utiliser ensuite comme prendre:Personnalisé.h
Personnalisé.m
Votre Contrôleur
Vous avez également de mettre en 'CustomCell" comme Identifiant de la Cellule dans l'IB
Pour ceux qui sont à la recherche d'un Swifty réponse, ajouter cette fonction à votre
CustomCell
classe:class DeviceCollectionViewCell: UICollectionViewCell { @IBOutlet weak var deviceName: UILabel! @IBOutlet weak var Capability: UILabel! @IBOutlet weak var brandLabel: UILabel! @IBOutlet weak var SVGIconview: UIView! override func prepareForReuse() { SVGIconview.subviews.forEach({ $0.removeFromSuperview() }) } }
C'est pour la suppression de copier du texte à partir de l'étiquette dans uicollectionviewcell.
Pour n'importe qui qui est de l'ajout UICollectionView par programme et ont une cellule personnalisé, en d'autres termes, XIB fichier, puis vous devez ajouter cette ligne à viewDidLoad