如何获取已被约束拉伸的视图的高度? - 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的主要内容,如果未能解决你的问题,请参考以下文章