【问题标题】:Swift - TextView layoutSubviews() not called during viewWillTransition()Swift - 在 vi​​ewWillTransition() 期间未调用 TextView layoutSubviews()
【发布时间】:2020-05-11 11:53:24
【问题描述】:

有谁知道为什么在将设备旋转到纵向模式时不调用 UITextView.layoutSubviews() ?

当旋转到横向模式时,这些被称为:

  • UIViewController.viewWillTransition
  • UIViewController.viewDidLayoutSubviews
  • UITextView.layoutSubviews
  • UILabel.layoutSubviews

但是当旋转回纵向时,UILabel.layoutSubviews() 被调用,而不是 UITextView.layoutSubviews。这是一个空项目,除了这些方法中的痕迹之外没有其他代码。

【问题讨论】:

  • 在这种情况下未调用时,您是否发现任何布局问题?
  • 没有布局警告。我需要调用 UITextView.layoutSubviews 方法的原因是因为我打算在 UITextView.layoutSubviews() 中有偏移代码,它将垂直居中文本。我也用这个代码进行了测试,并且在从垂直旋转到纵向时,它使用垂直顶部的文本重绘 UITextView,而不调用 layoutSubviews()。我真的不确定在哪里/如何拦截它。
  • 如果您在UIViewController.viewDidLayoutSubviews 中调用textView.setNeedsLayout() 怎么办?
  • 那也不行

标签: ios swift landscape-portrait layoutsubviews


【解决方案1】:

layoutSubviews 通常在之前的运行循环调用中已经调用setNeedsLayout() 时被调用。

如果布局系统认为不需要调用,就不会调用。

理想情况下,您不应覆盖此函数。您应该在进行superview 更改后调用setNeedsLayout(),并让布局系统调用此函数的默认实现。此外,您应该在自动布局中定义您的子视图布局需求,以便能够从那里获取正确的值。

如果您想立即更新,请致电layoutIfNeeded()

这是因为这是 UIKit 框架任意调用的方法之一,它可能不适合您的布局需求。

【讨论】:

    【解决方案2】:

    这里有两个不同的东西。

    1. 了解layoutSubviews()。 IE。何时何地使用它。
    2. 如何以正确的方式实现您想做的事情。 IE。在设备旋转时使用UITextView 做一些事情。

    关于layoutSubviews(),你不应该在这里放任何逻辑,因为你的视图没有任何子视图。

    您可能会说我们期望 iOS 调用它,所以我们可以在这里放置一些实现,但同样,这不是正确的方法。 layoutSubviews() 并不是要改变视图本身,而只是布置子视图。

    我建议阅读更多关于 layoutSubviews() 的内容。我从 here 那里学到的,当时我开始学习 iOS。

    现在要实现你想做的事情,即在设备旋转的时候做一些事情,你正确的方法是使用UIViewControllerviewWillTransition(to:with:)方法。

    在这种方法中,您可以将逻辑放在就在过渡发生之前。

    您还可以使用传递给viewWillTransition(to:with:)UIViewControllerTransitionCoordinator 参数放置将在转换期间转换完成后执行的逻辑

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2011-02-18
      相关资源
      最近更新 更多