调整大小后 UITableViewCell 中的 UIImageView 分辨率低

Posted

技术标签:

【中文标题】调整大小后 UITableViewCell 中的 UIImageView 分辨率低【英文标题】:UIImageView in UITableViewCell low resolution after resizing 【发布时间】:2016-05-15 15:35:56 【问题描述】:

我真的对自动布局和UITableViewCell 的东西感到沮丧。我有一个带有动态高度单元格的UITableView。细胞内部可以有图像。图像应该适合 UIImageView 的宽度。

图像大于 UIImageView 的大小。所以,下载图片后,我调整了图片大小,然后将其放入UIImageView 中。但是,根据 UIImageView 的宽度调整图像的大小会导致分辨率低,因为 UIScreen 的比例大于 1。所以我尝试在操作后增加图像的预期大小(size= (scale * imageViewWidth, scale * imageViewHeight))。

但是,这一次,单元格的高度变大了 2 倍。我要做的基本上是,在保持 UIImageView 的高度相同的同时,提高分辨率。

class ProgressImageView : UIImageView
    func setImage(imagePath:String?, placeholder:String, showProgress:Bool, showDetail:Bool)
            if imagePath == nil
                self.image = UIImage(named: placeholder)
            else

                if showProgress
                    self.setShowActivityIndicatorView(true)
                    self.setIndicatorStyle(.Gray)
                
                let placeholderImage = UIImage(named: placeholder)
                SDWebImageManager.sharedManager().downloadImageWithURL(NSURL(string: imagePath!), options: SDWebImageOptions.RefreshCached, progress: nil, completed:  (image, error, _, _, _) in
                    //resize image to fit width
                    if error != nil
                        self.image = placeholderImage
                    else 
                        self.setImageFitWidth(image)
                    
                )
            
    


extension UIImageView
    func setImageFitWidth(image: UIImage)
        let w = self.bounds.size.width //* UIScreen.mainScreen().scale
        print ("ImageView size:\(self.bounds.size) scaled width:\(w)")
        self.image = image.convertToWidth(w)
    


extension UIImage
    func convertToWidth(let width: CGFloat) -> UIImage
        print ("Old image size:\(self.size)")
        let ratio = self.size.width / width
        let height = self.size.height / ratio
        let size = CGSizeMake(width, height)
        print ("New image size:\(size)")
        UIGraphicsBeginImageContext(size)
        self.drawInRect(CGRectMake(0, 0, size.width, size.height))
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    

正如您在 setImageFitWidth 方法中看到的,没有 UIScreen.mainScreen().scale 它工作得很好,除了分辨率和比例,UIImageView 的大小翻倍。顺便说一句,我尝试了所有可能的内容模式选项(宽高比匹配、宽高比填充等),并且我正在使用自动布局。

导致低分辨率:

产生高分辨率:

我希望我的屏幕与第一个 ss 中的一样,但图像的分辨率在第二个 ss 中。

【问题讨论】:

我真的不明白问题出在哪里;你能让你的问题更清楚吗?另外,请您提供显示预期结果和实际结果的图像。我也不明白您所说的“提高分辨率”是什么意思。当您放大图像尺寸时,有效分辨率会降低(而不是提高)。 @RoboticCat 添加了屏幕截图,并在描述中进行了一些修复。希望这次很清楚。 【参考方案1】:

尝试使用UIGraphicsBeginImageContextWithOptions(size: size, opaque: YES, scale: 0) 绘制你的图像。 比例 0 表示该函数将从设备获得正确的比例因子。

【讨论】:

非常感谢,我假设如果我将图像的大小翻倍,图像视图可以使用宽高比匹配内容模式相应地调整图像,但我错了。感谢您,我现在对 UIImage 和 UIImageView 的工作原理有了更多了解!

以上是关于调整大小后 UITableViewCell 中的 UIImageView 分辨率低的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 中的 UIImageView - 始终调整为图像大小

UITableViewCell 中的 UIImage 调整大小太高

自我调整大小的 UITableViewCell 中的 UIlabel 和 UIView 高度计算

自调整大小的 UITableViewCell 中的水平 UILabels

在 UITableViewCell 中调整 UITextView 的大小

自定义 UITableViewCell 根据屏幕大小调整大小