我有一个名为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中的视图控制器始终按预期工作,将其扩展到视图的完整大小。 但是,在第二个和后面的选项卡中,不会发生这种情况:视图不会延伸。这显示了,例如,我是否在ViewController2 XIB中将制表符与底部对齐:在UITabBarItem中查看时,这不会位于底部。
注意 请注意,这与XIB无关:如果我反转ViewController1和ViewController2,那么ViewController1将无法扩展。它与UITabBarItem有关。
观 可能,这取决于我调用DashBoardViewController的initWithNibName时addSubview的方式。但我找不到解释这个的方法。
其他详情 所有XIB都设置为“Size = none”。
答案 0 :(得分:1)
如果没有看到你的XIB设置,我真的无法说话,但我可以提出一些建议。
您尝试通过删除&将子视图添加到DashBoardViewController应该真正由UITabBarController处理。这提供了一个UITabBar,一个内容视图,并处理UIViewControllers之间切换的逻辑,同时保持布局合理并成为SDK的一部分。
如果由于某种原因你不能或不想使用UITabBarController,我建议你在DashBoardViewController上实现一个viewWillLayoutSubviews
方法,如下所示:
- (void)viewWillLayoutSubviews
{
if( self.currentViewController )
{
self.currentViewController.view.frame = self.view.bounds;
}
}
也可以尝试在交换ViewControllers之后添加self.currentViewController.view.frame = self.view.bounds;
行,以便更好地衡量。这将确保当前ViewController视图的框架总是调整大小以填充DashBoardViewController视图的边界。
这不是'正确'的方法,但是如果可以的话,我真的建议使用UITabBarController,因为你不知道UITabBarController还有多少你最终会重新实现开始滚动你自己的控制器。
任何进一步的问题很可能与子ViewControllers的内部布局有关,而不是在DashBoardViewController视图中的大小/位置。
答案 1 :(得分:0)
在您的XIB文件上确保您设置灵活的高度以粘贴到顶部和底部,这样UITableView将始终具有与4“显示器相同的高度