プロトタイプセルを持つ UICollectionView があります。セルが読み込まれ、画像が表示され、ラベルが表示されます。セルのサイズが異なるため、CollectionViewFlowLayout を介して変更されます。それはうまくいきます。
シミュレーターでビューをスクロールすると、ラベルが再利用され、画像に間違って追加されたように見えます。これが発生せず、コレクションビューで画像のラベルが 1 つだけであることを確認するにはどうすればよいですか?
UICollectionView
#pragma mark - Collection view
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
self.Data = [NSArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, nil];
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return self.magazineLayout.count;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MagazineCell *mCell = (MagazineCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
int item = [indexPath row];
mCell.backgroundColor = [UIColor lightGrayColor];
// Set Image
UIImage *image;
image = [UIImage imageNamed:@"testimage.png"];
mCell.imageView.image = image;
// Set Label
NSString *title = [[NSString alloc] initWithFormat:@"Image %@", self.Data[item]];
[mCell addSubview:[self cellTitle:title indexPath:indexPath]];
return mCell;
}
// Title will be reused and placed wrongly on pictures !
-(UILabel *)cellTitle:(NSString *)name indexPath:(NSIndexPath *)indexPath {
CGSize itemSize = [self collectionView:self.collectionView layout:self.collectionView.collectionViewLayout sizeForItemAtIndexPath:indexPath];
int top = itemSize.height - 40;
int width = itemSize.width;
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, top, width, 40)];
title.textColor = [UIColor blackColor];
title.text = name;
title.backgroundColor = [UIColor whiteColor];
title.alpha = 0.5f;
return title;
}
編集:回避策の解決策
viewWithTag
うまくいきましたが、ラベルの位置を変更できませんでした。悲しいことに、これが最善の方法だと思います。ここで私の回避策viewWithTag
:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MagazineCell *mCell = (MagazineCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
mCell.backgroundColor = [UIColor lightGrayColor];
// Set Image
UIImage *image;
image = [UIImage imageNamed:@"testimage.png"];
mCell.imageView.image = image;
[self cellTitleAndBackground:mCell indexPath:indexPath];
return mCell;
}
-(void)cellTitleAndBackground:(MagazineCell *)mCell indexPath:(NSIndexPath *)indexPath {
// Get title
NSString *name = [[NSString alloc] initWithFormat:@"Image %@", self.Data[indexPath.row]];
// Get current cell size
CGSize itemSize = [self collectionView:self.collectionView layout:self.collectionView.collectionViewLayout sizeForItemAtIndexPath:indexPath];
int top = itemSize.height - 40;
int width = itemSize.width;
// Create title background
UILabel *titleBackground = [[UILabel alloc] initWithFrame:CGRectMake(0, top, width, 40)];
titleBackground.backgroundColor = [UIColor blackColor];
titleBackground.alpha = 0.2f;
titleBackground.tag = 70;
[self removeReusedLabel:mCell tag:70];
[mCell addSubview:titleBackground];
// Create titleLabel
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, top-8, width, 40)];
titleLabel.textColor = [UIColor whiteColor];
titleLabel.font = [UIFont boldSystemFontOfSize:14];
titleLabel.text = name;
titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.tag = 72;
[self removeReusedLabel:mCell tag:72];
[mCell addSubview:titleLabel];
}
-(void)removeReusedLabel:(MagazineCell *)mCell tag:(int)tag {
UILabel *foundLabelBackground = (UILabel *)[mCell viewWithTag:tag];
if (foundLabelBackground) [foundLabelBackground removeFromSuperview];
}
乾杯 -- ジェリック