来自url的UIImage加载的IOS CollectionView

时间:2014-12-07 17:42:48

标签: ios objective-c uiimage uicollectionview

我有一个UICollectionView,我想将图片从web加载到单元格上的UIImageView。 (标记为UIImageView:单元格为100。)

使用此方法时不会显示图片:

- (void)viewDidLoad
{
    [super viewDidLoad];
    Img = [NSArray arrayWithObjects:@"http://192.168.1.103:8088/Images/1.png",@"http://192.168.1.103:8088/Images/2.png",nil];
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *identifier = @"List";  
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    UIImageView *chImage = (UIImageView *)[cell viewWithTag:100];

    NSURL *imageUrl = [NSURL URLWithString:[Img objectAtIndex:indexPath.row]];
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
    chlImage.image = image;

    NSLog("%@",[Img objectAtIndex:indexPath.row]); //Here can show Img's values correctly 

    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"backgroung.png"]];

    return cell;
}

但是当我在项目中使用图片时,它可以正确显示。像这样:

 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *identifier = @"List";  
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    UIImageView *chImage = (UIImageView *)[cell viewWithTag:100]; 
    chImage.image = [UIImages imageNames:@"123.jpg"];

    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"backgroung.png"]];

    return cell;
}

为什么当我从网络上使用图片加载时它无法工作? (图片可以通过“浏览器”打开。)

可以给我一些提示或正确的代码吗?非常感谢你!

3 个答案:

答案 0 :(得分:3)

您希望从这一行获得UIImageView:

UIImageView *chImage = (UIImageView *)[cell viewWithTag:100];

但你不是。你只得到UIView。因此,您必须创建UIImageView,然后使用addSubview:方法将此UIImageView添加到backgroudView视图。

所以,它应该是:

UIImageView *chImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, cell.backgroundView.frame.size.width,cell.backgroundView.frame.size.height)];

NSURL *imageUrl = [NSURL URLWithString:[Img objectAtIndex:indexPath.row]];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
chImage.image = image;

NSLog("%@",[Img objectAtIndex:indexPath.row]); //Here can show Img's values correctly 

[cell.backgroundView addSubview:chImage];

最后,我有一个建议给你。看看SDWebImage图书馆。从URL获取图像是一个很棒的功能。

答案 1 :(得分:2)

通过继承UICollectioViewCell创建一个类ImageCell并创建一个属性ImageCell.h:

@interface ImageCell : UICollectionViewCell
    @property (nonatomic, strong) UIImage *dImage;
@end

然后在ImageCell.m中添加一个函数

- (void)downloadImageFromURL:(NSURL *)imageUrl
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];

        dispatch_sync(dispatch_get_main_queue(), ^{
            UIImageView *chImageView = (UIImageView *)[cell viewWithTag:100];
            chImageView.image = dImage;
        });
    });
}

现在来自UICollectionView委托:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"List";  
    ImageCell *cell = (ImageCell *)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    NSURL *imageUrl = [NSURL URLWithString:[Img objectAtIndex:indexPath.row]];
    [cell downloadImageFromURL:imageUrl];

    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];

    return cell;
}

最后请确保将标签100设置为您想要获得的ImageView。如果您有任何疑惑,请告诉我。

答案 2 :(得分:1)

只需将数据提取部件从集合视图的委托移动到它的viewDidLoad。

将图像存储到数组中。并将其用作集合视图的数据源。

ie。每次将图像添加到数组时只需重新加载集合视图。

或者你可以像'iOSGeek'建议的那样创建一个自定义单元格。