iOS - 在后台下载并分配给 UITableViewCell imageView 的图像未填充视图

Posted

技术标签:

【中文标题】iOS - 在后台下载并分配给 UITableViewCell imageView 的图像未填充视图【英文标题】:iOS - Image that is downloaded in the background and assigned to UITableViewCell imageView does not fill view 【发布时间】:2013-04-26 05:22:26 【问题描述】:

无法真正回答我的问题的类似问题

Objective C: How to fix aspect ratio of image (and not change to fit imageview frame) Resize UIImage with aspect ratio?

我在做什么

用户点击“保存”按钮。这将创建一个新的表格视图单元格。图片在另一个线程中下载。

我从 URL 下载图像 保存图片 在保持纵横比的同时缩放图像 将图像设置为之前创建的 UITableViewCell imageView

问题

问题是最后一步。 我希望图像填充视图并被剪裁。 但是,图像总是被绘制成完全适合 imageView 内部并带有一些空白区域。图像甚至不会在单个维度中填充单元格的 imageView。它与顶部、底部和左侧的空格右对齐。

当我在设置错误绘制的图像后点击单元格时,单元格会重绘并绘制图像以在一维中填充 imageView 但仍然没有被剪裁。

代码

我创建单元格并设置一个临时图像

cell.imageView.image = [UIImage imageNamed:@"125-food.png"];
cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
cell.imageView.layer.masksToBounds=YES;

我是这样开始工作的:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 500000 * NSEC_PER_USEC), dispatch_get_current_queue(), ^ /*Stuff*/ );

缩放图像代码

CGFloat newHeight;
CGFloat newWidth;
if(image.size.width>image.size.height)

    newHeight = 44.0;
    newWidth = image.size.width * newHeight / image.size.height;

else

    newWidth = 44.0;
    newHeight = image.size.height * newWidth / image.size.width;


CGRect newRect = CGRectMake(0,0,newWidth,newHeight);
UIGraphicsBeginImageContext(newRect.size);
[image drawInRect:newRect];
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;

然后我在单元格中设置 newImage

cell.imageView.image = newImage;

屏幕截图

新单元格不会填充 44x44 图像视图,并且旧单元格不会被剪裁。

【问题讨论】:

可以添加一些截图吗? 【参考方案1】:

我似乎已经解决了我的问题。首先,我缩放图像的方式不正确。我在这里找到了更好的方法UIImage: Resize, then Crop

我使用了Anybody提出的方法。因此,通过计算比例因子,我可以创建具有正确缩放比例的正确大小的图像。这使我不必在视图中剪辑图像。

CGFloat scaleFactor = 1.0;

//Deciding which factor to use to scale the image (factor = targetSize / imageSize)
if (image.size.width > targetSize.width || image.size.height > targetSize.height)
    if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or
        scaleFactor = targetSize.height / image.size.height; // scale to fit heigth.

UIGraphicsBeginImageContext(targetSize); 

//Creating the rect where the scaled image is drawn in
CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor) / 2,
                         (targetSize.height -  image.size.height * scaleFactor) / 2,
                         image.size.width * scaleFactor, image.size.height * scaleFactor);

//Draw the image into the rect
[image drawInRect:rect];

现在我只需要设置图像。 Set UIImageView Size in UITableViewCell when UIImage loaded from URL? 建议我应该能够设置图像。但这给了我一个像我的屏幕截图一样的结果。显然,我也无法控制表格单元格视图。

在Resize UIImageView in UITableViewCell 中建议在 imageView 上设置变换。我想既然缩略图已经调整大小,我应该只缩放到 1.0。

cell.imageView.transform = CGAffineTransformMakeScale(1.0, 1.0);

到目前为止,这似乎运作良好!

我的临时图标似乎可以正常工作,并且保存的缩略图显示正确。不同之处在于临时图像的大小不同。所以我把我的图标放大到正确的大小。我的图像现在可以正确显示了!

【讨论】:

以上是关于iOS - 在后台下载并分配给 UITableViewCell imageView 的图像未填充视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中的后台获取和后台传输以在后台下载数据 (JSON)

iOS Swift 在后台下载大量小文件

完成后在后台下载并唤醒应用程序

在后台下载数据的同时,从 JSON 中下载数据并存储到 CoreData 和 Display

如何使用 AFNetworking 3.0 在后台下载大文件并在会话完成所有任务时显示本地通知

IOS保留在后端做啥[关闭]