UIView layoutSubviews 没有被调用
Posted
技术标签:
【中文标题】UIView layoutSubviews 没有被调用【英文标题】:UIView layoutSubviews not being called 【发布时间】:2011-11-19 05:13:50 【问题描述】:使用 Xcode 4.2/ios5.0
我有一个 viewController 和一个关联的 viewController.xib。 viewController 被设置为 .xib 文件的所有者。它是从UINavigationController
调用的。
当设备纵向/横向旋转时,我正在尝试一些手动布局
据我了解,UIView
覆盖的方法是
- (void)layoutSubviews;
这是你做布局的地方
但是 - 与 drawRect
一样 - 你不能直接调用它,它会在适当的时候被 iOS 调用
你打电话给setNeedsLayout
...
所以我在 ViewController 中有这个
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)
fromInterfaceOrientation
[[self view] setNeedsLayout];
在同一个 ViewController 我有这个
- (void)layoutSubviews
//.manual override of automatic layout on rotation
NSLog(@"layoutSubviews");
但是layoutSubviews
没有被调用,我不明白为什么。
这里有一个线索...
如果我直接调用layoutSubviews
为[self layoutSubviews]
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)
fromInterfaceOrientation
[self layoutSubviews];
确实触发了
但如果我称它为[[self view] layoutSubviews]
它不会
看来视图和它的控制器没有正确连接?
【问题讨论】:
这将有助于***.com/questions/5031292/… 【参考方案1】:您的问题是您在视图控制器上实现了-layoutSubviews
,而不是在您的视图上。它永远不会被这样称呼。 -layoutSubviews
是一种机制,自定义视图可以通过该机制布置自己的子视图(例如,UIButton
具有用于图像的UIImageView
和用于标签的UILabel
,并使用-layoutSubviews
来确保图像视图和标签都正确定位)。它不是视图控制器可以控制其视图布局的机制。
如果您想更改旋转布局,那么您应该继续在-didRotateFromInterfaceOrientation:
中设置新布局。
【讨论】:
谢谢。我听从了你的建议,效果很好……我对此很陌生,仍然习惯于视图、控制器、模型、应用程序之间的关系。 Typo: -didRotateFormInterfaceOrientation: 应该是 -didRotateFromInterfaceOrientation: 我试图通过直接编辑静默修复,但它被认为太微不足道了......【参考方案2】:对于一般问题,当您忘记在父视图上使用子视图调用 addSubview 时,也会发生这种情况。
【讨论】:
以上是关于UIView layoutSubviews 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章
UIView的layoutSubviews和drawRect方法何时调用
UIView的layoutSubviews和drawRect方法何时调用
UIView的layoutSubviews和drawRect方法何时调用