【问题标题】:Why changing the UILabel text fires a viewDidLayoutSubviews event? [closed]为什么更改 UILabel 文本会触发 viewDidLayoutSubviews 事件? [关闭]
【发布时间】:2015-01-10 18:48:20
【问题描述】:

在我的 ViewController 中触发了很多 viewDidLayoutSubviews 事件。最终我缩小到触发事件的单行代码:

self.debugLabel.text = [NSString stringWithFormat:@"%@ - %@", key, [@(tag) stringValue]];

它是添加到 ViewController 的 self.view 的子视图中的 UILabel。为什么更改UILabel 的文本会导致边界更改?在viewDidLayoutSubviews文档:

当视图控制器视图的边界发生变化时,视图 调整其子视图的位置,然后系统调用它 方法。

附言我确信 debugLabel 的字体大小足够小以适合其框架。

【问题讨论】:

  • 我不久前注意到了这一点。在我看来,这总是一个错误。
  • 您是否检查过标签的框架在设置文本后是否真的发生了变化?
  • 这里没有错误。这是正常行为。你看得太仔细了,什么都不担心。别担心,开心就好。你不应该关心布局被触发的频率。
  • 这个问题似乎是题外话,因为它是预期的行为,而不是问题。
  • setTitle:forState: 不会触发 viewDidLayoutSubviews

标签: ios uiviewcontroller viewdidlayoutsubviews


【解决方案1】:

我相信这与自动布局有关。如果视图调整大小,则需要在视图层次结构的其余部分检查约束以确保它们得到满足。

【讨论】:

  • 更简单地说,标签的大小限制默认来自其固有大小 - 每次标签内容更改时都会更改。
  • 一个完全干净的项目,没有Auto Layout。将单个UILabel 添加到视图(在情节提要中),您将获得第二个viewDidLayoutSubviews 调用。打印根视图及其所有子视图框架 (viewDidLayoutSubviews) 显示在第二次调用中没有变化。但是,再添加 5 个标签不会添加任何 viewDidLayoutSubviews 调用。我还不清楚。
猜你喜欢
  • 1970-01-01
  • 2021-02-04
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多