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

Mic*_*use 7 uitableview ios autolayout swift

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

视图的层次结构就是这样

  • 的UITableViewCell
    • UITableViewCell.ContentView
      • 的UIImageView

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

  • 设置UIImageView => Heightremove at build time
  • 设定Intrinsic ValueUIImageViewplaceholder
  • 设置Intrinsic Value为每一个UIImageView,ContentViewUITableViewCellplaceholder

有了这些组合中的任何一个,我得到了这个观

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

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

Mic*_*use 10

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

我想保留AspectRatio图像,不管它是什么,Height同时修复Width根据UIImageView图像的容器.

该解决方案包括:

  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)
    
    Run Code Online (Sandbox Code Playgroud)

    当添加这个约束时,xCode会抱怨新的"冗余"约束并试图破坏它,使它变得无用,但显示的图像与我想要的完全一样.这引出了我的第二个解决方案

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

      aspectConstraint?.priority = 999

不知道为什么Xcode的自动添加UIView-Encapsulated-Layout-Height,并UIView-Encapsulated-Layout-Height在构建/运行时间; 但是,我学会了如何尊重它并与之共存:)

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

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0
Run Code Online (Sandbox Code Playgroud)