Ios 具有自动布局和UITableAutomaticDimension的动态高度表格单元(动态UILabel+多个UIImageView)

Ios 具有自动布局和UITableAutomaticDimension的动态高度表格单元(动态UILabel+多个UIImageView),ios,objective-c,iphone,uitableview,autolayout,Ios,Objective C,Iphone,Uitableview,Autolayout,我看了3天有关动态表格单元格和自动布局的文章,到目前为止还没有工作 下面是我想要的表格单元格。这里的主要问题是post文本和UIImage的UILabel 下面是UI元素的层次结构 - Content View + ... + UILabel for text - dynamic height + UIView - image view container * UIImageView * UIImageView * ....

我看了3天有关动态表格单元格和自动布局的文章,到目前为止还没有工作

下面是我想要的表格单元格。这里的主要问题是post文本和UIImage的UILabel

下面是UI元素的层次结构

- Content View
    + ...
    + UILabel for text - dynamic height
    + UIView - image view container
        * UIImageView
        * UIImageView
        * ....
标签的换行模式换行文本和换行设置为0。 标签和容器视图具有顶部、底部、前导和尾随约束。ImageView是在运行时添加的,具有顶部、前导、尾随、底部和高度约束。 第一个图像视图对容器视图具有顶部约束,最后一个图像视图对容器视图具有底部约束,其他视图对上部图像视图具有顶部约束

当第一次加载表格时,单元格具有不同的图像计数,看起来很好,但当我上下滚动时,某些单元格中的约束被打破,单元格中的图像重叠

以下是错误输出:

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:0x17428aaf0 V:|-(0)-[UIImageView:0x14be77ed0]   (active, names: '|':UIView:0x14be75b20 )>",
"<NSLayoutConstraint:0x17428a6e0 UIImageView:0x14be77ed0.height == 160   (active)>",
"<NSLayoutConstraint:0x17428acd0 UIImageView:0x14be77ed0.bottom == UIView:0x14be75b20.bottom   (active)>",
"<NSLayoutConstraint:0x174289650 V:|-(0)-[UIImageView:0x14be43ce0]   (active, names: '|':UIView:0x14be75b20 )>",
"<NSLayoutConstraint:0x17428bb80 UIImageView:0x14be43ce0.height == 160   (active)>",
"<NSLayoutConstraint:0x17428be50 V:[UIImageView:0x14be43ce0]-(10)-[UIImageView:0x14be74b10]   (active)>",

"<NSLayoutConstraint:0x17428bfe0 UIImageView:0x14be74b10.height == 160   (active)>",
"<NSLayoutConstraint:0x17428c080 UIImageView:0x14be74b10.bottom == UIView:0x14be75b20.bottom   (active)>"

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x17428be50 V:[UIImageView:0x14be43ce0]-(10)-[UIImageView:0x14be74b10]   (active)>

请帮我解决这个问题。谢谢。

我建议不要给出图像的高度,而是在容器视图中添加垂直堆叠视图,并将所有图像添加到其中。确保他们将内容模式设置为aspect fit,stackview应处理其余内容。不要忘记将stackview约束到标签底部和单元格底部,这样它就知道有多少空间。它将自行处理图像

要确保堆栈视图在单元格出列时不包含旧图像,您需要在PrepareForuse中清理它:

ImageView是在运行时添加的,具有顶部、前导、尾随、底部和高度约束

这是您的错误消息。删除高度或选择“底部”或“顶部”约束的约束之一。不能约束所有4条边并向其添加高度收缩

旁注:

宽度也是如此,如果设置宽度约束,则不能同时约束两侧的前导/尾随

编辑:


此外,使用注释部分中建议的UIStackView更容易。

我尝试过,但图像重叠,约束正在破坏。@Florens von Buchwaldt这看起来更像是一条注释。你应该在注释中给出建议,而不是在回答中。@PaulStein注意:仅适用于iOS 9.0+。@Skil,UIStackView在不破坏约束的情况下运行良好。但现在我面临着新的问题。单元格具有不同的图像视图计数,当我将可重用的表单元格出列时,堆栈视图已经包含一些图像视图。我该怎么办?我尝试删除所有图像视图并添加,但效果不好。@PaulStein检查我的答案,如果对您没有帮助,为计算/设置代理方法的高度添加代码,并在“我的答案”的评论部分添加注释。您可以显示更多代码、情节提要或单元格吗?一个单元格中最多可以显示多少图像?@himanshumuradiya,没有限制。用户可以附加他们想要的图像。我确实从容器视图中删除了所有的图像视图,并再次添加了它们,它正在工作。但是图像视图在闪烁。有没有更好的方法来平滑地显示图像?@PaulStein我很高兴它能工作!不知道你的意思是什么,你想让我在上面的答案中包括哪一部分?
override func prepareForReuse() {
    super.prepareForReuse()

    stack.arrangedSubviews.forEach {
        stack.removeArrangedSubview($0)
        $0.removeFromSuperview()
    }
}