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方法何时调用

layoutSubviews在以下情况下会被调用

UIView:layoutSubviews 与 initWithFrame

layoutSubviews drawRect调用时机