Ste*_*ler 259 cocoa-touch bounds ios layoutsubviews autolayout
我有一个自定义视图,layoutSubview
在动画期间没有收到消息.
我有一个填充屏幕的视图.如果我更改导航栏的高度,它在屏幕底部有一个自定义子视图,可以在Interface Builder中正确调整大小.layoutSubviews
在创建视图时调用,但从不再调用.我的子视图已正确布局.如果我关闭通话中状态栏,layoutSubviews
则根本不会调用子视图,即使主视图确实为其调整大小设置了动画.
在什么情况下layoutSubviews
实际上被称为?
我已经autoresizesSubviews
设置NO
为我的自定义视图.在Interface Builder中,我有顶部和底部支柱以及垂直箭头设置.
Bad*_*ate 478
我有一个类似的问题,但对答案(或者我在网上找到的任何答案)都不满意,所以我在实践中尝试过,这就是我得到的:
init
不会layoutSubviews
被称为(duh)addSubview:
导致
layoutSubviews
在添加的视图,添加到的视图(目标视图)以及目标的所有子视图上调用setFrame
智能电话layoutSubviews
上的图,其具有它的帧中设置仅在帧的尺寸参数是不同layoutSubviews
在scrollView及其superview上调用layoutSubview
父视图(响应的viewControllers主视图)layoutSubviews
其超级视图我的结果 - http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/
Pat*_*pel 84
在@BadPirate之前的回答的基础上,我进行了一些实验,并提出了一些澄清/更正.我发现layoutSubviews:
只有在以下情况下才会在视图上调用:
一些相关细节:
layoutSubviews:
每当UIScrollView滚动时调用它,因为它通过更改其边界的原点来执行滚动.layoutSubviews:
视图最终添加到视图层次结构中.setNeedsLayout
,它设置/引发一个标志.对于视图层次结构中的所有视图,运行循环的每次迭代都会检查此标志.对于发现引发标志的每个视图, layoutSubviews:
调用它并重置标志.将首先检查/调用层次结构中较高的视图.fro*_*cjn 19
只要视图中发生以下任何事件,就会发生布局更改:
一个.视图边界矩形的大小会发生变化.
湾 发生界面方向更改,这通常会触发根视图边界矩形的更改.
C.与视图图层关联的核心动画子图层集会更改并需要布局.
d.您的应用程序通过调用 视图的方法setNeedsLayout
或layoutIfNeeded
方法来强制进行布局 .
即 您的应用程序通过调用setNeedsLayout
视图的基础图层对象的方法来强制布局 .
小智 11
BadPirate的答案中的一些要点只是部分正确:
为了addSubView
点
addSubview
导致layoutSubviews在要添加的视图,要添加到的视图(目标视图)以及目标的所有子视图上被调用.
它取决于视图的(目标视图)自动调整大小掩码.如果它具有自动调整大小掩码ON,则将在每个调用layoutSubview addSubview
.如果它没有自动调整大小掩码,则只有在视图(目标视图)帧大小发生变化时才会调用layoutSubview.
示例:如果您以编程方式创建了UIView(默认情况下它没有自动调整大小),则仅当UIView帧不在每次更改时才会调用LayoutSubview addSubview
.
通过这种技术,应用程序的性能也会提高.
用于设备旋转点
旋转设备只调用父视图上的layoutSubview(响应的viewController的主视图)
只有当您的VC位于VC层次结构(root at window.rootViewController
)中时才会出现这种情况,这是最常见的情况.在iOS 5中,如果您创建了一个VC,但它没有被添加到任何其他VC中,那么当设备旋转时,此VC就不会被注意到.因此,调用layoutSubviews不会注意到它的视图.
我将解决方案跟踪到Interface Builder的坚持,即在打开模拟屏幕元素的视图(状态栏等)上无法更改弹簧.由于弹簧在主视图中关闭,因此该视图无法改变大小,因此当呼叫栏出现时,该视图完全向下滚动.
关闭模拟功能,然后调整视图大小并正确设置弹簧会导致动画发生并调用我的方法.
调试时的另一个问题是,当通过菜单切换通话中状态时,模拟器退出应用程序.退出app =没有调试器.
您是否看过layoutIfNeeded?
文档片段如下。如果在动画过程中显式调用此方法,动画是否起作用?
layoutIfNeeded如果需要,布置子视图。
- (void)layoutIfNeeded
Run Code Online (Sandbox Code Playgroud)
讨论使用此方法可以在绘制之前强制子视图的布局。
可用性在iPhone OS 2.0和更高版本中可用。
归档时间: |
|
查看次数: |
159518 次 |
最近记录: |