DashboardViewController

DashboardViewController

我有一个名为DashBoardViewController的UIViewController,它充当UITabBar的委托。在其xib中,我放置了带有3个UITabBarItem的UITabBar。

这些项目中的每一项都会激活一个不同的View Controller,我们将其称为ViewController1,ViewController2,ViewController3

DashBoardViewController应该显示ViewController1并在加载时选择第一个栏,因此在我的initWithNibName中,我具有以下内容:

...
ViewController1* vc = [[ViewController1 alloc] initWithNibName:@"ViewController1" bundle:nil];
[self.view addSubview:vc.view];
self.currentViewController = vc;
...


我实现具有以下内容的UITabBarDelegate:

if (item == viewController1Item) {
    ViewController2 *vc2 = [self.childrenControllers objectAtIndex:1];


    [self.currentViewController.view removeFromSuperview];
    [self.view addSubview:vc2.view];
    self.currentViewController = vc2;


} ...


问题
第一个UITabBarItem中的View Controller始终按预期工作,将其扩展到thew视图的完整大小。
但是,在第二个及以下选项卡中,不会发生这种情况:视图不会扩展。例如,这显示是否在ViewController2 XIB中将标签与底部对齐:在UITabBarItem内部查看时,标签不会位于底部。

注意
请注意,这与XIB无关:如果我将ViewController1和ViewController2反转,它将是ViewController1无法扩展。它与UITabBarItem有关。

主意
可能这取决于我调用DashBoardViewController的initWithNibName时addSubview的方式。但是我找不到一种解释方式。

其他详情
所有XIB均设置为“大小=无”。

最佳答案

在看不到我的情况下,我无法说真的话,但是我可以提出一些建议。

您试图通过删除子视图并将其添加到DashBoardViewController来实现的行为实际上应该由UITabBarController处理。这提供了一个UITabBar,一个内容视图,并处理了在UIViewController之间切换的逻辑,同时保持布局合理并成为SDK的一部分。

如果由于某种原因而不能使用UITabBarController,或者我不想使用UITabBarController,我建议在DashBoardViewController上实现viewWillLayoutSubviews方法,如下所示:

- (void)viewWillLayoutSubviews
{
    if( self.currentViewController )
    {
        self.currentViewController.view.frame = self.view.bounds;
    }
}


换掉ViewController之后,也许也可以尝试添加self.currentViewController.view.frame = self.view.bounds;行,以达到良好的效果。这样可以确保当前ViewController视图的框架的大小始终能够填充DashBoardViewController视图的边界。

不过,这不是“正确”的方法,我真的建议您尽可能使用UITabBarController,因为您不知道还有多少UITabBarController,如果您开始滚动您的UITabBarController,最终将重新实现自己的控制器。

任何进一步的问题很可能与子ViewController的内部布局有关,而不是其在DashBoardViewController视图中的大小/位置。

09-07 14:05