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

所以看起来 View 和它的 Controller 没有正确连接?

最佳答案

你的问题是你已经在你的 View Controller 上实现了 -layoutSubviews,而不是你的 View 。它永远不会被这样称呼。 -layoutSubviews 是一种机制,自定义 View 可以通过这种机制布局自己的 subview (例如,UIButton 具有图像的 UIImageView 和标签的 UILabel,并使用 -layoutSubviews 确保 ImageView 和标签都正确定位)。它不是 View Controller 可以控制其 View 布局的机制。

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

关于iphone - 未调用 UIView layoutSubviews,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8192072/

10-12 04:11