我有一个名为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视图中的大小/位置。