UICollectionView图像未显示

时间:2013-12-13 12:20:04

标签: ios7 uicollectionview popover

即使正在加载图片,我也会遇到图片无法显示的问题。我尝试了几种不同的方法和相同的结果......没有图像。我得到白色矩形,其大小和颜色在故事板中指定。我在popover中获得了正确数量的矩形。日志正确显示名称和ID。

如果我直接调用数组,我会得到相同的结果......白色矩形。

我的目标是iOS7。运行Xcode 5.0.2。图像来自SQL数据库。这是一个实时应用程序,我正在更新到完整的iOS7,我正在为UICollectionView交换自定义网格布局。使用CollectionViewController,嵌入到NavigationController中,通过UIButton访问。如您所见,没有自定义单元格。图像将以弹出窗口显示,然后由用户选择以更改基础视图的背景。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"BckgndCell" forIndexPath:indexPath];

    NSDictionary * tempDict = [_arrayOfBckgnds objectAtIndex:indexPath.row];
    NSNumber *buttonTagNumber = (NSNumber *)[tempDict objectForKey:@"id"];
    int buttonTag = [buttonTagNumber intValue];
    NSString *tempImage = [tempDict objectForKey:@"fileName"];

    NSLog(@"Filename: %@", tempImage);
    NSLog(@"ButtonTagNumber: %@", buttonTagNumber);
    UIImageView *image = [[UIImageView alloc]init];
    image.image = [UIImage imageNamed:tempImage];
    NSLog(@"Image.image: %@", image.image);

    // needed for selecting the background in didSelectItemAtIndexPath
    _bgtag = buttonTag;

    return cell;
}

修复包括在cellForItemAtIndexPath方法中实际命名BackgroundCell(duh)并在BackgroundCell控制器中创建一个小方法来设置图像。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    BackgroundCell *cell = (BackgroundCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"BckgndCell" forIndexPath:indexPath];

    NSDictionary * tempDict = [_arrayOfBckgnds objectAtIndex:indexPath.row];
    NSNumber *buttonTagNumber = (NSNumber *)[tempDict objectForKey:@"id"];
    int buttonTag = [buttonTagNumber intValue];
    NSString *tempImage = [tempDict objectForKey:@"fileName"];

    [cell setImage:[UIImage imageNamed:tempImage]];

    // needed for selecting the background in didSelectItemAtIndexPath
    _bgtag = buttonTag;

    return cell;
}

主细胞代码;

- (id)initWithFrame:(CGRect)frame
{
    _backgroundImage = [[UIImageView alloc] initWithFrame:self.contentView.bounds];

    [self.contentView addSubview:_backgroundImage];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)setImage:(UIImage *)image
{
    _backgroundImage.image = image;
}

2 个答案:

答案 0 :(得分:4)

问题是图像未在单元格的视图层次结构中设置。为此,子类UICollectionViewCell并在子类中创建imageView属性:

@interface CollectionViewCellSubclass : UICollectionViewCell
@property (nonatomic, strong) UIImageView *imageView;
@end

...并在initWithFrame

中初始化UIImageView
_imageView = [[UIImageView alloc] initWithFrame:self.contentView.bounds];
[self.contentView addSubview:_imageView];

将此子类设置为情节提要中单元格的自定义类,然后将其加载到上面的collectionView:cellForItemAtIndexPath方法中,将图像设置为单元格的图像子视图:

CollectionViewCellSubclass *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"BckgndCell" forIndexPath:indexPath];

//...

cell.imageView.image = [UIImage imageNamed:tempImage];

希望这有帮助。

答案 1 :(得分:1)

cell.contentView.frame = [cell bounds]行为我工作后添加dequeueReusableCellWithReuseIdentifier

假设您通过xib添加自定义(200,200)UICollectionViewCell并将其框架中的某个位置更改为例如(120,120)。您必须相应地设置其内容视图的框架,否则imageView上的图像(在其内容视图中)将无法正确显示。