【问题标题】:Make UIImage fit into UIImageView inside UIView使 UIImage 适合 UIView 内的 UIImageView
【发布时间】:2016-09-29 10:37:48
【问题描述】:

在 UIImageView 中使用正确的纵横比来调整图像时遇到了很多麻烦。

最初从 plist 插入核心数据的所有图像都符合正确的纵横比,但随着使用应用程序添加图像(来自现有图像库),三个视图中的两个视图中的图像看起来比视图大本身 - 只显示照片的左上角。在下面的屏幕截图中,表格的第一行显示了通过 plist 添加的图像,接下来的两行(我的记录)显示了不受视图限制的照片。

上述视图中的单元格以通常的方式创建,然后在其自己的方法中进行配置,其中定义了它的属性。

    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)中遇到了同样的问题,但是这个视图是使用故事板定义的。我有一个 UIImage 视图,它被约束到具有固定大小约束的 UIView 的所有侧面。 UIImage 视图设置为 Aspect Fit,但是当我从设备库设置图像时,它看起来像上面的图片 - 纵横比是正确的,但只显示图像的上角。

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

我看不到任何差异,我无法想象如何从这里调试。毫无疑问,我误解了关于 Aspect Fit 或如何应用它的一些非常简单的东西。

【问题讨论】:

  • 你确定你在正确的imageView上设置了.contentMode和.clipsToBounds吗? UITableViewCell 默认有一个 imageView 属性,用于显示基本单元格。另外,你在什么函数中调用这两个?
  • 在故事板中,单元格的标识符是'Cell',然后在tableView.cellForRowAtIndexPath委托方法中使用tableView.dequeueReusableCellWithIdentifier实例化单元格。然后将此单元格传递给 configureCell 方法,在该方法中添加 contentMode 和 clipsToBounds(连同文本和图像),然后由委托方法返回。
  • 使用 .UIViewContentMode.ScaleAspectFill。您无法将图像大小调整为您现在所期望的。即采取 whatsapp ,他们有同样的问题你所面临的。所以他们只需为所有图像坚持使用 .ScaleAspectFill。
  • 显示设置图像和内容模式的代码 - 全部
  • 您能否添加您的 cellForRowAtIndexPath 和 configureCell 方法的代码。

标签: swift uitableview uiimageview


【解决方案1】:

问题是如果您使用不包含任何约束的默认 imageView。当您加载更大的图像时,它将显示全尺寸。

两种解决方案:

  • 创建一个单元模型,插入您的 imageView,并在情节提要中为其设置约束。
  • 检查您添加到默认 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),并且图像会改变大小并且行为非常不稳定。我不知道这告诉我什么。
【解决方案2】:

尝试添加这个 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)]

【讨论】:

    【解决方案3】:
    • 使用您需要的设计创建自定义单元格。

    • 在左上和左下设置约束并设置宽度 UIImageview。

    • 使用 TableView 添加自定义 Xib。

    希望对你有帮助...

    【讨论】:

      【解决方案4】:

      可能会添加这样的内容:

      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
      }
      

      【讨论】:

      • 虽然这不是我希望的答案-我希望方面适合是一个内置功能-您(以及其他 cmets 和答案)向我展示了尽管苹果正在尝试做什么默认布局,毕竟很难避免确切地指定您需要的内容。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多