【问题标题】:layoutSubviews called twice when rotatinglayoutSubviews 旋转时调用了两次
【发布时间】:2013-01-29 21:25:39
【问题描述】:

当我的主视图旋转时,我想重新排列子视图,所以在我的 ViewController 中,我覆盖了

willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration

并在那里设置子视图的框架。这一切都很好,但是在子视图中我也覆盖了

 layoutSubviews

所以他们自己布局正确。但问题是这现在被调用了两次——大概一次是当我在 willAnimateRotationToInterfaceOrientation 中设置 Frame 时,一次是因为旋转。 (如果我不设置 Frame,它会被调用一次。)

当然,布局框架是 ViewController 的责任,所以这似乎是一个设计缺陷 - 解决方案是什么,所以 layoutSubviews 只被调用一次?

【问题讨论】:

  • 您可以将最后一个方向保存在一个私有变量中,并且只有在 lastOrientation != currentOrientation 并且在执行 layoutSubviews 代码之后才执行 layoutSubviews 代码,设置 lastOrientation = currentOrientation,这样它只会被调用一次单一方向
  • 是的,我确实想到了这一点,但似乎有点笨拙。如果我确实想在旋转以外的其他时间更改框架怎么办 - 那么 layoutSubviews 不会做任何事情!必须有更好的方法 - 这应该如何干净地完成?
  • -layoutSubviews 被调用两次有问题吗?
  • 嗯,这不是世界末日,但它效率低下,如果这是预期的设计,我会感到惊讶,所以让我觉得我错过了一些东西

标签: ios rotation viewcontroller layoutsubviews


【解决方案1】:

我也有同样的问题。我发现this page 对我有帮助。这对你有用吗?

编辑: 以下是页面摘要(复制):

  • init 不会导致 layoutSubviews 被调用 (duh)
  • addSubview 导致 layoutSubviews 在被添加的视图、它被添加到的视图(目标视图)以及目标视图的所有子视图上调用
  • setFrame 智能调用 layoutSubviews 的 view 设置它的 frame 只有当 frame 的 size 参数不同时
  • 滚动 UIScrollView 会导致在 scrollView 上调用 layoutSubviews,它是 superview
  • 旋转设备只会在父视图(响应的 viewControllers 主视图)上调用 layoutSubview
  • removeFromSuperview – layoutSubviews 仅在 superview 上调用(不显示在表格中)

【讨论】:

  • 嗨,Armin,欢迎来到 SO。我们不鼓励仅提供链接的答案,您能否总结一下该链接的内容?
  • 是的!谢谢你告诉我这件事:) 我发布了摘要并用粗体标记了我认为有帮助的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多