使用Autolayout在UITableViewCell中单个UIImageView

时间:2016-09-05 13:07:06

标签: ios iphone uitableview uiimageview autolayout

我正在尝试使用动态单元格高度和AutoLayout(即tableView.rowHeight = UITableViewAutomaticDimension)在UITableView中放置一个包含单个UIImageView的UITableViewCell。

我将要显示的图像具有特定比率(1000:667),但除了图像单元之外还有其他单元格。我为这个单元构建了约束逻辑,以尊重UIImageView的纵横比

因此,为避免错误或图像的某些部分未显示(剪辑子视图),宽高比约束应根据设备屏幕宽度确定单元格的高度。

单元格是在Nib文件中构建的,具有以下约束:

IB constraints

显然这可以,因为根据所使用的设备(模拟器),在运行时相应地设置单元格的高度。

问题是我得到了很多违规约束错误日志(如下)。任何想法为什么iOS /表查看有关此约束的投诉?

关于显示尊重宽高比的UITableViewCell的不同方法的建议也将受到赞赏。

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x7ff5097a7910 UIImageView:0x7ff5097393a0.width == 1.49925*UIImageView:0x7ff5097393a0.height>",
    "<NSLayoutConstraint:0x7ff509739550 V:|-(0)-[UIImageView:0x7ff5097393a0]   (Names: '|':UITableViewCellContentView:0x7ff5097a8e10 )>",
    "<NSLayoutConstraint:0x7ff5097aa180 UIImageView:0x7ff5097393a0.centerY == UITableViewCellContentView:0x7ff5097a8e10.centerY>",
    "<NSLayoutConstraint:0x7ff5097a8c70 H:|-(0)-[UIImageView:0x7ff5097393a0]   (Names: '|':UITableViewCellContentView:0x7ff5097a8e10 )>",
    "<NSLayoutConstraint:0x7ff5097a8cc0 H:[UIImageView:0x7ff5097393a0]-(0)-|   (Names: '|':UITableViewCellContentView:0x7ff5097a8e10 )>",
    "<NSLayoutConstraint:0x7ff5097b6440 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7ff5097a8e10(276)]>",
    "<NSLayoutConstraint:0x7ff5097b4930 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7ff5097a8e10(414)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7ff5097a7910 UIImageView:0x7ff5097393a0.width == 1.49925*UIImageView:0x7ff5097393a0.height>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

3 个答案:

答案 0 :(得分:4)

这一原因b&#39; cos你给了不必要的自动布局(高度,宽度和中心y)。

例如。你给了高度然后顶部和底部,高度是固定的仍然你给了顶部和底部对齐......这是不必要的...

enter image description here

你可以尝试这个建议。

1)center y + Trailing + Leading + Height. 2)Top + Bottom + Trailing + Leading. 3)height + width + center y + Leading 还有更多

我希望你明白......

答案 1 :(得分:1)

Fdo,你发布的日志清楚地解释了那里出了什么问题:)

有什么问题?

  1. 您在imageView上设置了宽高比。因此,imageView将在分配图像时尝试调整自身大小,同时保持您指定的宽高比。因此,ImageView的高度和宽度可能会有所不同,具体取决于您指定的图像。

  2. 您已将imageView中的尾随和前导空间约束应用于单元格的contentView。这意味着无论发生什么,您都希望图像视图覆盖整个单元格的宽度。你与自己的约束相冲突。就在上面你说imageView可以自由改变它的框架现在你说它应该覆盖整个单元格的宽度,这甚至可能是什么伙伴?

  3. 同样,您将图像视图的顶部和底部约束应用于单元格的contentView。那为什么那不破呢?很简单,因为基于传递给imageView的图像动态计算单元格高度。显然,调整大小后imageView的大小将等于单元格的高度。因此,细胞高度没有问题。

  4. 如何解决?

    1. 简单地删除imageView上的尾随和前导空间约束到单元格的contentView,而是在imageView上应用水平中心约束,这也会给出imageViews x位置,并且不会弄乱imageView的宽度。因此,没有任何约束会破坏,一切都会像魅力一样起作用
    2. 额外的建议

      当你指定imageView对单元格内容视图有顶部和底部约束时,这意味着imageView高度将始终等于单元格的高度,dude是否真的有理由说imageView将是在细胞的垂直中心?因为无论如何你的imageView将覆盖整个单元格从上到下。任何方式它都不会破坏任何东西,但是传递超出实际需要的约束并不是最好的事情,因为它可能会在未来导致其他后果。 / p>

      希望它有所帮助。

答案 2 :(得分:0)

对于自动布局任何视图,只需要满足的是所有视图都应该获得宽度,高度以及x和y位置。

现在从你的问题来看,它看起来你提供的6个约束中,只有最后4个constaints足以完成需求,因此不需要前2个约束。只需删除它们。一切都会好的。

您看到的警告消息是由于您提供的两个以上的约束使系统难以接受它们。