Ios 具有自动布局和UITableAutomaticDimension的动态高度表格单元(动态UILabel+多个UIImageView)
我看了3天有关动态表格单元格和自动布局的文章,到目前为止还没有工作 下面是我想要的表格单元格。这里的主要问题是post文本和UIImage的UILabel 下面是UI元素的层次结构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 * ....
- 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()
}
}