什么时候调用布局子视图?

什么时候调用布局子视图?

我有一个定制的视图layoutSubview动画期间的消息。

我有一个充满屏幕的视图。它在屏幕底部有一个自定义子视图,如果我更改导航条的高度,它将在InterfaceBuilder中正确调整大小。layoutSubviews在创建视图时调用,但不会再次调用。我的子视图布局正确。如果我关闭调用状态栏,则子视图的layoutSubviews则根本不调用,即使主视图确实对其大小进行了动画化。

在什么情况下layoutSubviews真的打电话了?

我有过autoresizesSubviews设为NO我的定制视图。在InterfaceBuilder中,我有顶部和底部的支柱和垂直箭头集。


这个难题的另一个部分是,必须将窗口设置为键:

[window makeKeyAndVisible];

否则,子视图不会自动调整大小。


月关宝盒
浏览 290回答 3
3回答

白衣非少年

在@BadPirate之前的回答的基础上,我做了进一步的实验,并提出了一些澄清/更正。我发现layoutSubviews:只有在下列情况下,才会在视图上调用:它自己的界(不是框架)改变了。它的一个直接子视图的界限发生了变化。子视图将添加到视图中或从视图中删除。一些相关细节:只有在新值不同的情况下,才会认为边界是更改的,包括一个不同的起源..请特别注意,这就是为什么layoutSubviews:每当UIScrollView滚动时调用,因为它通过更改边界的来源来执行滚动。更改框架只会在大小更改时更改边界,因为这是传播到边界属性的唯一内容。视图层次结构中尚未出现的视图边界上的更改将导致调用layoutSubviews: 当视图最终被添加到视图层次结构时.为了完整起见:这些触发器不会直接调用layoutSubview,而是调用setNeedsLayout,它设置/升起一个旗子。对于所有视图,运行循环的每一次迭代在视图层次结构中,这个标志被选中。对于每个发现升起国旗的视图,layoutSubviews:被调用并重置标志。将首先检查/调用层次结构上较高的视图。

largeQ

我跟踪解决方案的原因是InterfaceBuilder坚持不能在打开模拟屏幕元素(状态栏等)的视图上更改Spring。由于弹簧为主视图关闭,该视图无法更改大小,因此,当调用栏出现时,整个视图都会向下滚动。关闭模拟的功能,然后调整视图大小和正确设置弹簧会导致动画发生,并调用我的方法。调试中的另一个问题是,当调用状态通过菜单切换时,模拟器退出应用程序。退出app=没有调试器。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS