简单UICollectionView显示图像表现奇:一些图像显示正确,有的在错误的位置,一些疏漏之处

2019-08-03 14:33发布

我想用一个UICollectionView,呈现出3个图像的行显示在iPhone上的栅格图像。 对于“死了简单的测试”(我认为),我已经添加了15张JPG图片到我的项目,这样他们就在我的包,我可以通过[UIImage的imageNamed:...]简单地加载它们。

我想我所做的一切都是正确的(设置和注册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”是一个NSArray持有所有JPG文件名部分的代码:

- (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和文件名之间的映射是正确的。

有没有人的想法可能导致此怪异的行为?

Answer 1:

在此期间,我已经找到了解决办法。 它实际上是在我执行一个非常微妙的错误UICollectionViewCellAlbumCoverCell

问题是,我已经设置了电池实例的帧作为的帧UIImageView子视图,而不是通过细胞的的bounds属性的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


文章来源: Simple UICollectionView to show images behaves odd: Some Images are displayed correct, some at wrong position, some missing at all