从网络在标题部分视图中加载 UIImageView 的图像
Posted
技术标签:
【中文标题】从网络在标题部分视图中加载 UIImageView 的图像【英文标题】:Load image for UIImageView in header section view from network 【发布时间】:2018-11-06 14:21:18 【问题描述】:我使用UITableView
并希望在部分标题中显示UIImageView
以及从网络加载的图像。所以我的方法
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
返回下一个UIView
:
UIView * header = [UIView new];
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 200);
header.backgroundColor = UIColor.clearColor;
UserDataModel * userData = [CoreDataService sharedInstance].userData;
UIImageView * userImageView = [UIImageView new];
userImageView.frame = CGRectMake(20, 20, self.view.frame.size.width * 0.3, self.view.frame.size.width * 0.3);
dispatch_async(dispatch_get_global_queue(0,0), ^
NSData * data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: userData.photoPath]];
if (data == nil)
return;
dispatch_async(dispatch_get_main_queue(), ^
userImageView.image = [UIImage imageWithData: data];
);
);
[header addSubview:userImageView];
return header;
而且它只有在滚动表格视图后才有效,我不知道我做错了什么。请解释我为什么它是错误的以及如何正确地做到这一点。 谢谢。
【问题讨论】:
如你所说,获取图片是异步的,不要放在viewForHeader中,我建议你存储一个下载图片的引用,拿到后重新加载表格。 使用这个..github.com/SDWebImage/SDWebImage生活会更轻松 【参考方案1】:添加图片后重新加载 UIImageView。
dispatch_async(dispatch_get_main_queue(), ^
userImageView.image = [UIImage imageWithData: data];
[userImageView setNeedsDisplay];
);
【讨论】:
【参考方案2】:首先使用SDWebImage 下载一次,因为您当前的代码会在每次出现标题时下载它
第二次为所有标题创建一个模型数组(imagesUrls),然后循环获取url
UIImageView*img = [UIImageView new];
for (int section = 0; section < [myArray count]; section++)
MyModel *model = [myArray objectAtIndex:section];
[img sd_setImageWithURL:[NSURL URLWithString:model.url] completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL)
[tableView reloadSections:[[NSIndexSet alloc] initWithIndex:section] withRowAnimation:NO];
];
【讨论】:
以上是关于从网络在标题部分视图中加载 UIImageView 的图像的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView 从存储在 Core Data 中的文件路径加载
UIScrollView 子视图和 setNeedsDisplay