UIView layoutSubviews未被调用
使用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]
它就不会
那么看起来视图和它的控制器没有正确连线?
这里的问题是你在视图控制器上实现了-layoutSubviews
,而不是在你的视图上。 永远不会这样称呼它。 -layoutSubviews
是一种机制,通过该机制,自定义视图可以布置自己的子视图(例如, UIButton
具有图像的UIImageView
和标签的UILabel
,并使用-layoutSubviews
确保图像-layoutSubviews
和标签都正确定位)。 它不是视图控制器可以控制其视图布局的机制。
如果要在旋转时更改布局,那么您应该继续在-didRotateFromInterfaceOrientation:
设置新布局-didRotateFromInterfaceOrientation:
。
对于一般问题,当您忘记在superview上调用addSubview和子视图时,也会发生这种情况。