Swift - 在viewWillTransition()期间没有调用TextView layoutSubviews()。

问题描述 投票:0回答:1

有谁知道为什么当设备旋转到纵向模式时,UITextView.layoutSubviews()没有被调用?

当旋转到横向模式时,这些都会被调用。

  • UIViewController.viewWillTransition()。
  • UIViewController.viewDidLayout Subviews
  • UITextView.layoutSubviews
  • UILabel.layoutSubviews

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

ios swift landscape-portrait layoutsubviews
1个回答
0
投票

layoutSubviews 通常在以下情况下被调用 setNeedsLayout() 在之前调用运行循环时已经被调用。

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

理想情况下,你不应该重写这个函数。你应该只调用 setNeedsLayout() 在做出 superview 变化,让布局系统调用这个函数的默认实现。更重要的是,你应该在auto-layout里面定义你的子视图布局需求,这样它就能从那里获得正确的值。

如果你想立即更新,你应该调用 layoutIfNeeded().

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


0
投票

这里有2个独立的东西。

  1. 了解 layoutSubviews(). 即何时何地使用它。
  2. 如何实现你想做的事情 正道. 即:用 UITextView 在设备旋转时。

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

你可以说我们 期待 iOS来调用,所以我们可以把一些实现放在这里,但这又不是正确的方式。layoutSubviews() 并不是要改变视图本身,只是布置子视图。

我建议大家多看一些关于 layoutSubviews(). 我学到了 此处,当我开始学习iOS的时候。

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

在这种方法中,你可以把逻辑来做一些事情。 的过渡将发生。

你也可以把逻辑放在执行 过渡期过渡期后,使用 UIViewControllerTransitionCoordinator 传给 viewWillTransition(to:with:)

希望对大家有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.