【问题标题】:Adding a view controller's view as a subview changes it's frame?添加视图控制器的视图作为子视图会更改其框架?
【发布时间】:2011-02-08 18:53:50
【问题描述】:
    SomeViewController *someVC = [[SomeViewController alloc] initWithNibName:@"SomeViewController" bundle:nil];
    self.someViewController = someVC;
    [someVC release];


    NSLog(@"height before added as subview: %f", self.someViewController.view.frame.size.height);
    [self.containerView addSubview:self.someViewController.view];
    NSLog(@"height AFTER added as subview: %f", self.someViewController.view.frame.size.height);

    // height before added as subview: 480.000000
    // height AFTER added as subview: 540.000000

对此有什么可能的解释? someViewController 的视图没有设置任何自动调整大小的属性,并且 containerView 不会自动调整它的子视图。仅将其添加为子视图会导致框架发生什么变化?

另一个谜团是它只发生在 someViewController 的视图高度 >= 480 时。

【问题讨论】:

  • 那是个谜……如果用边界替换框架会得到什么?

标签: iphone uiview uiviewcontroller frame resize


【解决方案1】:

SomeViewController 是什么样的视图控制器?我认为可能发生的一件事是SomeViewController 可能包含一些额外的内容,例如UINavigationController 的顶部栏,有时会自动增加大小。但是您所做的是通过将一个视图控制器的视图添加到另一个视图控制器来违反 HIG。 UIViewController 设计为屏幕的完整视图或属于专用视图控制器,例如 UITabBarControllerUINavigationControllerUISplitViewController。因此,someViewController 将无法按预期运行,并且不会接收到诸如viewDidLoad 之类的呼叫。因此,如果您确定没有设置自动调整大小属性,我建议您使用 UIView 而不是 UIViewController

【讨论】:

  • 这就是我最终要做的。但是是什么阻止了 viewDidLoad 在前一种情况下被调用?
  • viewDidLoad 和其他类似方法没有被调用的原因是因为这些消息不会被转发到您的子视图控制器。 Apple 设计了诸如UINavigationController 之类的控制器来将所有适当的消息转发到视图控制器,因此当您尝试仅将控制器的视图添加到不再发生的另一个视图时。
【解决方案2】:

这可能是由视图的 autoresizingMask 引起的,其目的是调整大小以适应其超级视图的变化。

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多