我有一个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;
}
为什么当我从网络上使用图片加载时它无法工作? (图片可以通过“浏览器”打开。)
可以给我一些提示或正确的代码吗?非常感谢你!
答案 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'建议的那样创建一个自定义单元格。