Swift UITableViewCell内UIImageView的动态大小

Swift UITableViewCell内UIImageView的动态大小,swift,uitableview,swift3,uiimageview,constraints,Swift,Uitableview,Swift3,Uiimageview,Constraints,我在Main.storyboard中定义了一个UIImageView,在UITableViewCell中,我希望它根据屏幕大小改变宽度,并改变高度,使其纵横比与UIImage相同 (例如FB应用程序中的新闻提要–图像总是具有相同的宽度,但根据其原始纵横比不同的高度) 我尝试了以下选项(基于其他SO问题): 设置尾随、前导、底部和顶部约束(全部=8) (我的单元格根据其内容扩展其高度) UITableView中的一个UIImageView似乎大小正确 其他图像的上方和下方都有巨大的空白 这个空白

我在Main.storyboard中定义了一个
UIImageView
,在
UITableViewCell
中,我希望它根据屏幕大小改变宽度,并改变高度,使其纵横比与
UIImage
相同

(例如FB应用程序中的新闻提要–图像总是具有相同的宽度,但根据其原始纵横比不同的高度)

我尝试了以下选项(基于其他SO问题):

  • 设置尾随、前导、底部和顶部约束(全部=8)

    • (我的单元格根据其内容扩展其高度)
    • UITableView
      中的一个
      UIImageView
      似乎大小正确
    • 其他图像的上方和下方都有巨大的空白
    • 这个空白似乎随着滚动而增加
  • 同上,加上
    UIImageView.frame

    • 最常见的建议可能是更改
      UIImageView.frame=CGRect(…)
    • 图像视图忽略了这些说明,并且所有单元格或单元格中的所有图像视图的大小仍然相同
    • 图像视图在那里放置了一些随机高度,并且在图像下方有大量空白
  • 这有助于:

    • 它适用于许多图像,但有些图像上下仍有空白+肖像(“高大”图片)左右都有空白
    • 这两种情况都可以通过大力调用
      tableView.reloadData()
      直到显示正确的大小来解决
    • 滚动浏览tableView会把一切都搞砸
  • 我尝试了更多的方法(例如,添加高度约束而不是直接操纵帧),但一切归结为两件事:奇怪的空格和/或滚动时的问题,因此需要反复触发
    tableView.reloadData()
    ,以获得所需的结果

    那么,推荐的方法是什么


    OT:这种行为(内容和属性的意外更改)非常常见,我在给图钉(地图中的注释标记)上色时也经历过这种情况。当我移动地图使插脚在屏幕上不可见并向后移动时,插脚切换颜色(wtf)。也许有一种更通用的方法来处理所有这些类似的事情?

    问题是,当细胞启动时,我从网络上下载图像,而当它们被重新使用时,我又从网络上下载图像

    只加载一次单元格内容并存储它们就解决了问题

    另一种方法是计算单元格内容高度,并将其定义为
    heightForRowAt indexPath

    let aRatio = (image?.size.width)! / (image?.size.height)!
    cell.myImageView?.contentMode = .scaleAspectFit
    let aRatioConstraint = NSLayoutConstraint(item: cell.myImageView, 
                                                    attribute:  NSLayoutAttribute.width, 
                                                    relatedBy: NSLayoutRelation.equal, 
                                                    toItem: cell.myImageView,
                                                    attribute: NSLayoutAttribute.height, 
                                                    multiplier: aRatio, 
                                                    constant: 0.0)
    cell.myImageView?.addConstraint(aRatioConstraint)