【问题标题】:UIView layoutSubviews not being calledUIView layoutSubviews 没有被调用
【发布时间】: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] 它不会

看来视图和它的控制器没有正确连接?

【问题讨论】:

标签: iphone objective-c ios


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我听从了你的建议,效果很好……我对此很陌生,仍然习惯于视图、控制器、模型、应用程序之间的关系。
  • Typo: -didRotateFormInterfaceOrientation: 应该是 -didRotateFromInterfaceOrientation: 我试图通过直接编辑静默修复,但它被认为太微不足道了......
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多