【问题标题】:Swift: How to get the size of a subview before it is being displayed?Swift:如何在显示之前获取子视图的大小?
【发布时间】:2015-10-23 22:11:48
【问题描述】:

一个视图 (a) 包含一个子视图 (b),其中包含一个文本标签。

文本标签的文本设置在视图 (a) 的 viewDidLoad 中。 标签中的文本量会改变子视图的大小(b)。

我只在视图 (a) 的 viewDidAppear 中得到正确大小的子视图 (b),但在 viewDidLayoutSubviews 中没有。

如何在视图(a)的视图控制器中获取子视图(b)在显示前的大小?

更新:使用自动布局

【问题讨论】:

  • 你在使用自动布局吗?
  • 是的,我使用自动布局
  • 那么大小viewDidLayoutSubviews,在你设置好文本之后。如果您对此表示怀疑,请出示您的代码,我会运行它并向您证明。
  • 嘿,如果您发布一些代码,我想我们可以提供更多帮助。
  • 谢谢大家,我在viewDidLoad 期间的某个子程序中的某个地方调用了self.view.layoutIfNeeded()。因此,我得到了错误的框架。

标签: swift uiview uiviewcontroller autolayout


【解决方案1】:

问题是我在viewDidLoad 期间调用layoutIfNeeded 并且设置文本标签的文本之前。

它强制立即调用viewDidLayoutSubviews,之后不再调用。

这是错误的调用序列,包括子视图的框架高度,即 163.0,情节提要上的文本标签为空,190.5,文本标签的文本集为 190.5。

viewDidLoad begin: frame.height: 163.0
viewDidLayoutSubviews: frame.height: 161.5 // should not be called yet
viewDidLoad end: frame.height: 161.5
viewWillAppear: frame.height: 161.5
viewDidAppear: frame.height: 190.5

删除layoutIfNeeded后:

viewDidLoad begin: frame.height: 163.0
viewDidLoad end: frame.height: 163.0
viewWillAppear: frame.height: 163.0
viewDidLayoutSubviews: frame.height: 190.5
viewDidAppear: frame.height: 190.5

【讨论】:

  • 出色的侦探工作。赞成解决您自己的问题。如果我每次触发这样的意外更改时都获得五分钱……但是,我也对您最初的问题投了反对票,因为它没有任何代码。对此感到抱歉。
  • @matt 对于正在阅读您评论的任何人,我想澄清一下关于 SO 的问题不需要任何代码。这已在 Meta SO 上进行了详细讨论。不包含任何代码的问题不是投反对票的理由。
  • 也许在 general 代码中不是必需的。但是你的问题需要代码。你需要向我们展示你在做什么,而你没有。因此,除了您之外,任何人都无法回答所提出的问题。见stackoverflow.com/help/mcve
猜你喜欢
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多