如何获取已被约束拉伸的视图的高度? - iOS

Posted

技术标签:

【中文标题】如何获取已被约束拉伸的视图的高度? - iOS【英文标题】:How to get the height of a view that has been stretched by constraints? - iOS 【发布时间】:2018-02-07 11:13:52 【问题描述】:

我有以下视图层次结构:

根视图 子视图

根的高度和宽度已经被约束(Top、Bottom、Leading、Trailing)拉伸,应该是 500 左右。孩子的高度也是由约束设置的,所以它也应该等于 500。

一切看起来都很好,但是当我访问孩子的 frame.bounds.height 时,它会返回整个屏幕的高度,而不是估计的 500。更糟糕的是,当我访问 frame.bounds.height 时Rootview 它返回 0,因为我已将框架设置为 .Zero。

我现在的问题是,如何从视图中获取被约束拉伸的宽度和高度?在我看来 .frame.bounds 不适用于自动布局。

展示:

    print("collectionView height: ", String(describing: collectionView.frame.height) )

简历高度:0.0

CollectionView 是棕色视图:

我的主要目标是制作一个与棕色 collectionView 一样大的单元格。但这失败了,因为我无法获得动态大小的 collectionView 的宽度。

【问题讨论】:

ios AutoLayout - get frame size width的可能重复 您是否尝试过从frame.bounds.height 中删除bounds?另外,在哪里你在找这个? viewDidLoad?太早了 - 试试viewDidLayoutSubviews lthe4kman 所有答案都已过时,因为这个问题已经超过 6 年了 @dfd 嘿,谢谢你的回答。我正在 viewDidLoad 中尝试这个。我现在在 viewDidLayoutSubviews 中试试 非常感谢您的帮助。我在这方面工作了这么久!谢谢。 【参考方案1】:

根据 cmets,看来我帮助解决了这个问题。它涉及到视图控制器的“生命周期”,以及“帧”的确切时间”。

简略的生命周期是:

viewDidLoad viewWillAppear viewWillLayoutSubviews viewDidLayoutSubviews viewDidAppear

一个简单的检查 - 使用控制台和/或断点 - 这将显示一些事情:

虽然viewDidLoad 知道边界,但它对帧一无所知。 viewWillLayoutSubviews 可能知道框架,但它(通常)不止一次被调用。 -viewDidLayoutSubviews` 虽然 * 可能被多次调用,但它是帧大小“保证”的最早时刻。

我被要求发布这个作为答案,但我在这里寻找更好的来源。我发现两个 - 和 both 是同一个问题的一部分。

UIViewController lifecycle

前三个答案都很好(我更喜欢第三个,因为它与这个问题最匹配。)

对于这个问题,它会知道何时可以确定帧大小是已知的。 viewWillLayoutSubviews 可能有效,但如果有效,viewDidLayoutSubviews 是最好的选择。

【讨论】:

以上是关于如何获取已被约束拉伸的视图的高度? - iOS的主要内容,如果未能解决你的问题,请参考以下文章

iOS 约束。如何通过约束设置图像视图高度比率等于图像比率?

iOS 约束:如何给 UILabel 高度约束优先级

iOS:以编程方式添加约束获取视图高度作为唯一指标

iOS 自动布局 - xib 中的等高约束

iOS 如何设置约束以适应设备屏幕?

ID3DXFont : 文本被拉伸,如何获取字体的宽度和高度?