我想使用UICollectionView在iPhone上的网格中显示图像,每行显示3张图像。对于一个“死的简单测试”(我认为),我已经为我的项目添加了15个JPG图像,因此它们将在我的包中,我只需通过[UIImage imageNamed:...]加载它们。 / p>
我认为我已经做了一切正确的事情(设置和注册UICollectionViewCell子类,使用UICollectionViewDataSource协议方法),但是,UICollectionView表现得非常奇怪:
它仅显示以下模式中的一些图像: 第一行显示图像1& 3,第二行是空白,下一行再次像第一行(图1和3显示正确),第四行空白,依此类推......
如果我在我的NavBar中按下一个触发[self.collectionView reloadData]的按钮,随机单元格会出现或消失。让我疯狂的是,这不仅是图像出现与否的问题。有时,图像也在单元格之间交换,即它们出现在indexPath中,它们肯定没有连线!
这是我的单元格代码:
@interface AlbumCoverCell : UICollectionViewCell
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@end
@implementation AlbumCoverCell
@synthesize imageView = _imageView;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_imageView = [[UIImageView alloc] initWithFrame:frame];
[self.contentView addSubview:_imageView];
}
return self;
}
- (void)dealloc
{
[_imageView release];
[super dealloc];
}
- (void)prepareForReuse
{
[super prepareForReuse];
self.imageView.image = nil;
}
@end
我的UICollectionViewController子类的部分代码,其中'imageNames'是一个包含所有jpg文件名的NSArray:
- (void)viewDidLoad
{
[super viewDidLoad];
[self.collectionView registerClass:[AlbumCoverCell class] forCellWithReuseIdentifier:kAlbumCellID];
}
#pragma mark - UICollectionViewDataSource Protocol methods
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [self.imageNames count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
AlbumCoverCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kAlbumCellID forIndexPath:indexPath];
NSString *imageName = [self.imageNames objectAtIndex:indexPath.row];
NSLog(@"CV setting image for row %d from file in bundle with name '%@'", indexPath.row, imageName);
cell.imageView.image = [UIImage imageNamed:imageName];
return cell;
}
#pragma mark - UICollectionViewDelegateFlowLayout Protocol methods
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
{
return CGSizeMake(100, 100);
}
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
{
return UIEdgeInsetsMake(0, 0, 0, 0);
}
从cellForItemAtIndexPath中的NSLog语句:我可以看到为所有单元格调用的方法(不仅是显示的单元格)以及indexPath.row和filename之间的映射是正确的。
有人知道什么可能导致这种奇怪的行为吗?
答案 0 :(得分:50)
与此同时,我找到了解决方案。在我的UICollectionViewCell
子类AlbumCoverCell
的实现中,这实际上是一个非常微妙的错误。
问题是我将单元格实例的框架设置为UIImageView
子视图的框架,而不是传递单元格的contentView
的边界属性!
以下是修复:
@implementation AlbumCoverCell
@synthesize imageView = _imageView;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// WRONG:
// _imageView = [[UIImageView alloc] initWithFrame:frame];
// RIGHT:
_imageView = [[UIImageView alloc] initWithFrame:self.contentView.bounds];
[self.contentView addSubview:_imageView];
}
return self;
}
- (void)prepareForReuse
{
[super prepareForReuse];
// reset image property of imageView for reuse
self.imageView.image = nil;
// update frame position of subviews
self.imageView.frame = self.contentView.bounds;
}
...
@end