UIView layoutSubviews未被调用

时间:2011-11-19 05:13:51

标签: iphone objective-c ios

使用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]则不会

所以看起来视图和它的控制器没有正确连线?

2 个答案:

答案 0 :(得分:5)

您的问题是您在视图控制器上实现了-layoutSubviews,而不是在您的视图上。永远不会这样称呼它。 -layoutSubviews是一种机制,通过该机制,自定义视图可以布置自己的子视图(例如,UIButton对于图像具有UIImageView而对于标签具有UILabel,以及使用-layoutSubviews确保图像视图和标签都正确定位。它不是视图控制器可以控制其视图布局的机制。

如果您想在轮换时更改布局,那么您应该继续在-didRotateFromInterfaceOrientation:内设置新布局。

答案 1 :(得分:0)

对于一般性问题,当您忘记在superview上调用addSubview和子视图时,也会发生这种情况。