ios - SDWebImage加载图片在cell上显示混乱
高洛峰
高洛峰 2017-04-17 17:25:23
[iOS讨论组]

在使用,SDWebImage加载图片的时候,出现图片加载混乱,具体情况是

1> 从服务器获取数据,如果返回的数组有数据即图片地址,则没有问题,如果数组为空那么,这个空数组展示的cell则会出现图片加载紊乱。
2> 我用的SDWebImage加载图片的方法是:
[backgImgView sd_setImageWithURL:[NSURL URLWithString:propertyImgs[i]] placeholderImage:[UIImage imageNamed:[Utils imageNameStr:@"PlaceHolder"]]];

具体使用到的函数:

 for (int i = 0; i < propertyImgs.count; i++) {
            
      UITapGestureRecognizer *backgImgViewTapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgImgViewTapGRAction:)];
            backgImgViewTapGR.numberOfTapsRequired  = 1;
            //    backgImgViewTapGR.numberOfTouchesRequired = 1;
            
     UIImageView *backgImgView = [[UIImageView alloc] init];
      backgImgView.userInteractionEnabled = YES;
            [backgImgView addGestureRecognizer:backgImgViewTapGR];
            
          
            
            
            [backgImgView sd_setImageWithURL:[NSURL URLWithString:propertyImgs[i]] placeholderImage:[UIImage imageNamed:[Utils imageNameStr:@"PlaceHolder"]]];
            

            
            backgImgView.frame = CGRectMake(i*Kwidth, 0, Kwidth, scrollContainerView.frame.size.height);//i*Kwidth
            [scrollContainerView addSubview:backgImgView];

            lastImgView = backgImgView;
        }

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
黄舟

题主这个问题让我很疑惑,题主写的这个列表视图,可能使用了用tableView,在cell中嵌套了ScrollView,所以我觉得题主可能是在做一个Cell可以横向滑动的滚动tableView,如果真是这样的话,题主这段加载UIImageView的代码可能是在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法里,代码篇幅有限,不知道题主有没有在每次执行这段代码前,移除scrollContainerView中旧的ImageView

UITableViewCell是有复用机制的,可以有效节省内存开销。所谓的复用机制,就是我们使用的

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

生成的cell,其实不一定是一个新实例,例如你当前屏幕总共可以显示3个cell(如你的图),那你的内存中,可能只有4个cell实例,在不停的循环调用。

所以当你的服务器出现返回空数组的情况时,for循环不执行,但是scrollview中的别的数组的图还在内存中并未清除,所以出现了你所谓的混乱。

如果返回不空,你新创建的UIImageView覆盖了旧的,所以看起来是对的,但是内存在不断增加没有释放。

解决办法:你自己想吧,我也不清楚你完整的代码,只是猜测一下原因。提亮点建议

1 你的scrollContainerView在for循环前面,把所有UIImageView移除掉。

[scrollContainerView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [obj removeFromSuperview];
}]

2 更好的办法是,好好研究一下复用机制,参考著名的nimbus框架的NIViewRecycler类,或者直接拿来用,把你的UIImageView也复用了。可能需要花点时间,但弄明白以后绝对值得。

ps:这个问题跟SDWebImage半毛钱关系都没有。

ringa_lee
显示混乱和这个下载图片的 函数也没关系吧。
高洛峰

试下用带 completed 的方法

图片加载完之后调用一下 cell 的 layoutSubviews

黄舟

我用过类似的Swift的框架,也有类似的问题,不过稍微一下就又会现实正确的图片。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号