gpt4 book ai didi

ios - UICollectionView 中重复使用的单元格显示多个 UIImageView,而它们应该只显示一个

转载 作者:IT王子 更新时间:2023-10-29 07:49:46 26 4
gpt4 key购买 nike

我的 UICollectionView 有问题。最初它显示良好,显示单元格网格,每个单元格都有一个 UIImageView。这些 UIImageViews 显示存储在应用程序包中的具有透明度的 PNG。

我的问题是,一旦滚动了 UICollectionView,某些单元格似乎已损坏。

损坏的单元格显示多个图像彼此堆叠,最上面的图像是它应该显示的图像,下面的图像是应该在其他单元格中使用的图像。

我最好的猜测是这与重用 UICollectionView 中的单元格的方式有关,但我愿意接受建议。

这是我用于在 UICollectionView 中创建单元格的委托(delegate)代码:

// 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;

}

如果需要,我可以提供更多代码。

我怎样才能阻止细胞腐败?

最佳答案

问题是您不断向 UICollectionViewCell 添加 View ,因为它们会被 UICollectionView 自动重复使用。所以旧的 UIImageView 仍然在单元格上,因为您在调用 cellForItemAtIndexPath: 时又添加了一个。

不要使用 addSubview:!

相反,您可以制作一个自定义单元格,其中包含您想要的所有 View 。因此,当调用 cellForItemAtIndexPath: 时,您只需设置此 CustomCollectionViewCell 的内容即可。

这样它肯定不会被损坏。


如何构建 CustomCell。

第 1 步:创建 .h 和 .m 类。

自定义单元格.h

#import <UIKit/UIKit.h>

@interface CustomCell : UICollectionViewCell
{
UIImageView *imageView;
}

@property (nonatomic, retain) UIImageView *imageView; //this imageview is the only thing we need right now.

@end

自定义单元格.m

#import "CustomCell.h"

@implementation CustomCell

@synthesize imageView;

- (id)initWithFrame:(CGRect)aRect
{
if (self = [super initWithFrame:aRect])
{
//we create the UIImageView in this overwritten init so that we always have it at hand.
imageView = [UIImageView alloc] init];
//set specs and special wants for the imageView here.
[self addSubview:imageView]; //the only place we want to do this addSubview: is here!

//You wanted the imageView to react to touches and gestures. We can do that here too.
UITapGestureRecognizer * tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onButtonTapped:)];
[tap setNumberOfTapsRequired:1];
[self addGestureRecognizer:tap];


//We can also prepare views with additional contents here!
//just add more labels/views/whatever you want.
}
return self;
}

-(void)onButtonTapped:(id)sender
{
//the response to the gesture.
//mind that this is done in the cell. If you don't want things to happen from this cell.
//then you can still activate this the way you did in your question.

}

第 2 步:导入它!现在我们已经创建了 CustomCell,我们可以将它导入到我们想要使用它的类中。

第 3 步:实际使用它!

// creates the individual cells to go in the menu view
- (CustomCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

// create collection view cell
CustomCell *cell = (CustomCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath]; //this is the place where the CustomCell does his magic.
//Make sure to use the CustomCellReuseId that you register in the viewdidload/loadview (step4)

// add a button image
NSString * buttonPath=[[NSBundle mainBundle] pathForResource:@"button" ofType:@"png" inDirectory:[[buttons objectAtIndex:indexPath.row] objectForKey:@"name"]];

cell.imageView.image = [UIImage imageWithContentsOfFile:buttonPath]; //place the image on the CustemCell.imageView as we prepared.

// set tag to the indexPath.row so we can access it later
[cell setTag:indexPath.row]; //we don't need this to access the cell but I left this in for your personal want.

/*
* we can now do this from the CustomCell as well!
*
// add interactivity
UITapGestureRecognizer * tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onButtonTapped:)];
[tap setNumberOfTapsRequired:1];
[cell addGestureRecognizer:tap];
*/
// return the cell
return cell;

}

Step4:将cell注册到collectionView

在 viewDidLoad/loadView 添加这一行:

[_collectionView registerClass:[CustomCell class] forCellWithReuseIdentifier:@"CustomCell"];

第 5 步:享受吧!您的 CustomCell 已完成。现在随心所欲,别忘了喝点咖啡。

关于ios - UICollectionView 中重复使用的单元格显示多个 UIImageView,而它们应该只显示一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19269266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com