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

时间:2013-04-26 05:22:26

标签: ios uitableview uiimageview uiimage scale

类似的事情并没有真正回答我的问题

我在做什么

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

  • 我从网址下载图片
  • 保存图片
  • 在保持纵横比的同时缩放图像
  • 将图像设置为之前创建的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;

截屏

Screen shots of cells

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

1 个答案:

答案 0 :(得分:0)

我似乎解决了我的问题。首先,我缩放图像的方式不正确。我在这里找到了更好的方法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);

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

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