【问题标题】:UIImageView with Aspect Fill inside custom UITableViewCell using AutoLayout使用 AutoLayout 在自定义 UITableViewCell 中填充 Aspect 的 UIImageView
【发布时间】:2015-05-17 17:53:43
【问题描述】:

我一直在努力安装一个UIImageView,它使用Aspect Fill 显示可变宽度和高度的图像。单元格高度不适应 UIImageView 的新高度并保持其高度。

视图的层次结构是这样的

  • UITableViewCell
    • UITableViewCell.ContentView
      • UIImageView

我在 XCode 自动布局中尝试了这些场景:

  • UIImageView => Height 设置为remove at build time
  • UIImageViewIntrinsic Value设置为placeholder
  • UIImageViewContentViewUITableViewCellIntrinsic Value 设置为placeholder

使用这些组合中的任何一种,我都会得到这样的观点:

http://i.stack.imgur.com/Cw7hS.png

蓝线代表单元格边界(边界),绿线代表UIImageView 边界(边界)。在这个例子中有四个单元格,第一个和第三个没有图像,第二个和第四个有相同的图像(溢出那些没有图像的)。

【问题讨论】:

  • 为什么不使用.ScaleToFill 来计算必须在单元格中设置的图像的宽度和高度才能获得更好的结果?
  • .ScaleToFill 不会保持图像的纵横比。考虑一下这种情况,如果我有一个高度和宽度相等(正方形)的图像,并且想要放入 UIImageView 内,我相信它会拉伸。
  • 是的,您是对的,但是如果您计算宽度与原始图像大小的比例,您可以将图像的宽度设置为大于单元格,并且图像将保持其纵横比。
  • 假设我这样做了,单元格将如何根据其内容的高度调整其高度,特别是UIImageView。考虑这样一种场景:手机摄像头在纵向模式下拍摄图像,并且高度远大于图像的宽度。
  • 查看更新的答案。希望能帮到你

标签: ios uitableview swift autolayout


【解决方案1】:

假设您有一个UIImage,尺寸分别为widthheight 的768 x 592,高度始终保持相等,例如在上述尺寸(iPad)中旋转的设备,width图像更改为 1024,height 保持不变。

您可以做些什么来保持图像的外观,将其缩放到您想要的尺寸,例如,如果您知道来的图像总是具有相同的尺寸,例如 1280x740 ,您可以设置 @987654326 @ 到.ScaleToFill 并按以下方式计算:

(widthOfTheImage / heightOfTheImage) * heightWhereYouWanToSet = widthYouHaveToSet

例如:

(1280 / 740) * 592 = 1024

这是我必须在UIImage 中设置的width,以在更改宽度时保持图像的比例。

我希望你明白我想对你说的地方。

【讨论】:

  • 我想你想说的是如何将UIImage 放入UIImageView 中,对吧?我遇到的问题实际上与UIImageView 无关,而实际上与包含单元格有关。我只有 iPhone 的纵向模式,宽度始终是固定的。因此,当我将图像放入其中时,尽管UIImageView 的高度发生了变化,但单元格的高度仍然是固定的。不确定我们是否在同一页面上。
【解决方案2】:

我根据之前的两个答案拼凑出一个解决方案:

我想保留图像的AspectRatio 而不管它的Height,同时根据图像的容器UIImageView 的固定Width

解决方案包括:

  1. 添加新的AspectRatio 约束

    let image = UIImage(ContentFromFile: "path/to/image")
    let aspect = image.size.width / image.size.height
    
    aspectConstraint = NSLayoutConstraint(item: cardMedia, attribute:  NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: cardMedia, attribute: NSLayoutAttribute.Height, multiplier: aspect, constant: 0.0)
    

    添加此约束时,xCode 将抱怨新的“冗余”约束并尝试破坏它,使其无用,但仍会完全按照我想要的方式显示图像。这将我引向第二个解决方案

    1. 将新约束的优先级降低到 '999' 似乎可以阻止 xcode 破坏它,并且它停止显示有关新约束的警告消息

      aspectConstraint?.priority = 999

不知道为什么 xCode 会在构建/运行时自动添加 UIView-Encapsulated-Layout-HeightUIView-Encapsulated-Layout-Height;但是,我学会了如何尊重并接受它:)

只是将解决方案留在这里供任何人检查。这适用于 iOS 8。我尝试使用 iOS7,但它与您需要实现 tableView:heightForRowAtIndexPath 根据其中包含的所有项目计算单元格的高度并禁用设置不同:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0

【讨论】:

  • 不需要这样做。太复杂。只需使用 [imageView setClipsToBounds: YES]。参考:stackoverflow.com/questions/14609132/…
  • 我不认为你有这个问题。问题是关于让 UITableViewCell 高度适应其中图像的高度,这与将图像拟合到 UIView 内并剪裁其边界不同。
  • 为简单起见,只需添加一个图像高度的约束(这在storyboard中很容易做到)并在设置图像时计算它。优先级也应该是 999。
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多