0

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

这些项目中的每一个都激活不同的视图控制器,我们称它们为 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 中的视图控制器始终按预期工作,将其扩展到 w 视图的完整大小。但是,在第二个和随后的选项卡中,这不会发生:视图不会扩展。这表明,例如,如果我将一个选项卡与 ViewController2 XIB 中的底部对齐:当在 UITabBarItem 内查看时,它不会位于底部。

注意 请注意,这与 XIB 无关:如果我反转 ViewController1 和 ViewController2,它将是 ViewController1 未能扩展的那个。它与 UITabBarItem 相关。

想法 可能,这取决于我在调用 DashBoardViewController 的 initWithNibName 时 addSubview 的方式。但我找不到解释这个的方法。

其他细节 所有 XIB 均设置为“Size = none”。

4

2 回答 2

1

如果没有看到它,我无法真正说出您设置 XIB 的方式,但我可以提出一些建议。

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

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

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

也许也可以self.currentViewController.view.frame = self.view.bounds;在您交换 ViewControllers 之后尝试添加该行,以获得良好的衡量标准。这将确保您当前 ViewController 视图的框架始终调整大小以填充 DashBoardViewController 视图的边界。

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

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

于 2013-01-23T21:59:01.080 回答
0

在您的 XIB 文件上,确保您将灵活高度设置为固定在顶部和底部,这样 UITableView 将始终具有与 4" 显示器相同的高度

在此处输入图像描述

于 2013-01-22T17:08:54.740 回答