从网络在标题部分视图中加载 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 中的文件路径加载

iOS:将 UIImageView 对齐到顶部

UIScrollView 子视图和 setNeedsDisplay

UIImageView 在 UIScrollView 内未正确定位

iOS 为 UIImageView 获取图像的可见部分

加载视图控制器后如何加载 UIImageView