UICollectionView を使用して iPhone のグリッドに画像を表示し、3 つの画像を 1 行に表示したいと考えています。「非常に単純なテスト」のために (私が思ったように)、プロジェクトに 15 個の JPG 画像を追加して、それらがバンドルに含まれるようにし、[UIImage imageNamed:...] を介して簡単にロードできるようにしました。
私はすべて正しいことをしたと思います (UICollectionViewCell サブクラスのセットアップと登録、UICollectionViewDataSource プロトコル メソッドの使用)、しかし、UICollectionView は非常に奇妙な動作をします:
次のパターンでいくつかの画像のみを表示します: 最初の行は画像 1 と 3 を示し、2 行目は空白、次の行は最初の画像と同じように (画像 1 と 3 は適切に表示されます)、4 行目は空白などです。 .
[self.collectionView reloadData] をトリガーする NavBar のボタンを押すと、ランダムなセルが表示または非表示になります。私を夢中にさせるのは、画像が表示されるかどうかだけの問題ではないということです. セル間で画像が入れ替わることもあります。つまり、それらは 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 とファイル名の間のマッピングが正しいことがわかります。
この奇妙な動作を引き起こす原因を誰か知っていますか?