iOS UIView 的动态高度取决于内部元素的数量
Posted
技术标签:
【中文标题】iOS UIView 的动态高度取决于内部元素的数量【英文标题】:iOS UIView with dynamic height depending on number of elements inside 【发布时间】:2015-07-09 11:52:51 【问题描述】:我需要动态创建一个UIView
并将其显示为UITableView
或UIScrollView
中的一个单元格。
如何在不手动计算视图高度(将所有元素的高度相加)的情况下做到这一点?
示例:我以编程方式在 UIView 中添加 2 个图像和 10 个文本,它们彼此垂直堆叠。我把这个 UIView 放在单元格内容视图或滚动视图中。如何确保视图自行扩展,以便显示内部的所有子视图?
编辑:
我想正确的方法是为每个子视图从上到下设置垂直和水平约束(包括最后一个元素的底部约束)。
问题是我无法为动态 UIView 中的每个元素设置高度约束,因为这些元素也有动态高度。
【问题讨论】:
通过正确指定 AutoLayout 约束。CGRectGetMaxY(lastView.frame)
如果UILabel
/UIImageView
不指定尺寸约束,则从内容中推断出它们的高度和宽度。
【参考方案1】:
您不需要添加明确的高度限制。您将添加为子视图(图像视图、标签)的视图将具有自己的固有大小。只要确保您有前导、尾随、顶部和底部约束,单元格就会自行调整大小。
【讨论】:
我知道视图需要有设计师明确的高度限制。例如,当我创建两个具有顶部、左侧、右侧、底部约束的视图时,我收到“缺少约束”错误:grab.by/IH1s。 @michal.ciurus 这些是普通的 UIView 吗?它们没有内在大小。但是,如果您使用的是图像视图或标签之类的东西,它们将具有固有大小。 1. UILabel 不会显示这些错误。 UIIMageView 可以。 grab.by/IH1W 2.intrinsicContentSize
继承自 UIView,因此 UIView 确实具有固有大小。 developer.apple.com/library/ios/documentation/UIKit/Reference/…
实际上答案在这里:***.com/questions/26833627/… 底线是:“缺少约束”并不总是坏事。您可以为 UIView 定义内在大小。
但是如果这个 UIView 在另一个 UIView 里面呢?【参考方案2】:
Rounak 的回答很棒,但并不完整。
对于内部有子视图的复杂视图,只需从顶部到底部和侧面创建适当的约束就足够了。如果你没有明确设置高度约束,它会自动设置它自己的高度。
对于像 UILabel
或 UIImageView
或 MyCustomCircleImage
这样的自定义叶子视图,您必须覆盖 intrinsicContentSize
。
如果AutoLayout没有上下约束的连接,就会转向固有尺寸。
【讨论】:
以上是关于iOS UIView 的动态高度取决于内部元素的数量的主要内容,如果未能解决你的问题,请参考以下文章
iOS:根据 View 位置动态改变 UILabel Alignment
IOS - UIView中使用AutoLayout的UILabel动态高度