使UIImage适应UIView内的UIImageView

7
我在UIImageView中无法让图片按正确的比例适应,这让我很苦恼。
最初从plist插入到核心数据中的所有图像都具有正确的宽高比,但是随着应用程序添加图像(从现有图像库中),三个视图中的两个视图中的图像似乎比视图本身更大,因此仅显示照片的左上角。 在下面的屏幕截图中,表格的顶行显示通过plist添加的图像,下面两行(MY RECORDS)显示未限制于视图的照片。

enter image description here

上述视图中的单元格是按照通常的方式创建的,然后在其自己的方法中进行配置,其中定义了其属性。
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    self.configureCell(cell, indexPath: indexPath)
    return cell
}

    func configureCell(cell: UITableViewCell, indexPath: NSIndexPath)
{
    let record = fetchedResultsController.objectAtIndexPath(indexPath) as! Record
    cell.textLabel!.text = record.subject
    cell.detailTextLabel!.text = record.shortDetails

    if let imageArray = imagesForRecord(record)
    {
        if imageArray.count > 0
        {
            cell.imageView?.contentMode = .ScaleAspectFit
            cell.imageView?.clipsToBounds = true
            cell.imageView?.image = imageArray[Int(record.featureImageIndex)]
        }
    }
}

但是图片不会自动缩放,也不会在imageView的边界内裁剪。最初加载的图像(如熊)不需要设置contentMode或clipsToBounds。
我在另一个视图控制器(称为VC2)中遇到了同样的问题,但这个视图是使用storyboard定义的。我有一个UIImage视图,它被限制在一个具有固定大小约束的UIView的所有边缘上。UIImage视图被设置为Aspect Fit,但当我从设备库设置一张图片时,它看起来像上面的图片-纵横比正确,但只显示了图片的顶部角落。

enter image description here

enter image description here

在另一个视图中,我几乎与VC2具有相同的故事板布局,但在这里它按预期工作。我看不出任何约束、属性方面的区别,并且使用的是相同的照片(来自库)。

enter image description here

enter image description here

我看不到任何区别,也无法想象如何从这里进行调试。毫无疑问,我对Aspect Fit或其应用方式存在一些简单的误解。


1
你确定你在正确的imageView上设置了.contentMode和.clipsToBounds吗?UITableViewCell默认具有一个imageView属性,用于显示基本单元格。另外,在哪个函数中调用这两个函数? - Mercurial
在Storyboard中,单元格的标识符为'Cell',然后在tableView.cellForRowAtIndexPath委托方法中使用它来实例化带有tableView.dequeueReusableCellWithIdentifier的单元格。然后将该单元格传递给configureCell方法,在此方法中添加contentMode和clipsToBounds(以及文本和图像),然后由委托方法返回。 - DrWhat
@NSGangster - 不是。 - DrWhat
尝试打印 imageView.frame? 在某些图像上显示为180x140,就像你的约束一样吗? 这虽不能解决问题,但可以让你朝着正确的方向前进。 要么排除 imageView 的框架发生了什么问题,要么你知道这是由其他原因引起的错误。 - NSGangster
抱歉 - 这一定是一个空白页面加载。主表视图上的框架是:Optional((16.0, 0.0, 132.0, 101.5))。 - DrWhat
显示剩余5条评论
4个回答

1
问题在于如果您使用默认的imageView,则它不包含任何约束条件。当您加载更大的图像时,它将显示全尺寸。
两种解决方案:
1. 创建一个单元格模型,插入您的imageView,并在故事板中为其添加约束条件。 2. 检查您添加到默认imageView的约束条件。
例如:
let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
newView.translatesAutoresizingMaskIntoConstraints = false
cellView.addConstraint(horizontalConstraint)

我认为单元格模型并不能解决问题,因为根据原始问题,故事板模型中也存在问题。我已经添加了更多细节到问题中以更清楚地展示这一点。如果其他故事板视图中的问题得到解决,我会很乐意这样做。我尝试检查默认imageView添加的约束,就像您建议的那样(但使用newView = cell.imageView和cellView = self.View),图片大小会改变并且表现非常不稳定。我不知道这告诉我什么。 - DrWhat

0
  • 创建一个自定义单元格,具有所需的设计。

  • 在左上和底部设置约束,并为UIImageview设置宽度。

  • 将自定义Xib添加到TableView中。

希望这能帮到你...


0
尝试添加这个代码 cell.imageView?.layer.masksToBounds = true。它可以帮助你。
    cell.imageView?.contentMode = .ScaleAspectFit
    cell.imageView?.clipsToBounds = false
    cell.imageView?.layer.masksToBounds = true
    cell.imageView?.image = imageArray[Int(record.featureImageIndex)]

0

或许可以加入类似这样的内容:

class func imageWithImage(image: UIImage, scaledToSize newSize: CGSize) -> UIImage {
    //UIGraphicsBeginImageContext(newSize);
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
    image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
    var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

虽然这不是我所希望的答案 - 我希望 aspect fit 是一个内置函数 - 但你(以及其他评论和答案)已经向我展示了,尽管苹果试图通过默认布局来实现某些功能,但毕竟很难避免准确地指定你需要的内容。谢谢。 - DrWhat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接