Ios UITabBarController-子(选项卡)视图控制器的边界不正确且不一致
我有一个带有两个选项卡的Ios UITabBarController-子(选项卡)视图控制器的边界不正确且不一致,ios,ios7,uitabbarcontroller,Ios,Ios7,Uitabbarcontroller,我有一个带有两个选项卡的UITabBarController。每个选项卡都是一个UITableViewController 当出现UITabBarController时,两个选项卡视图的边界都不正确。第一个选项卡正确位于导航栏下方,但在底部的选项卡栏下方延伸。第二个选项卡与此相反,从导航栏下方开始,但在底部的选项卡栏之前正确停止 我正在创建并演示TabBarController,如下所示: ActiveListTabBarViewController* listTabBarController
UITabBarController
。每个选项卡都是一个UITableViewController
当出现UITabBarController
时,两个选项卡视图的边界都不正确。第一个选项卡正确位于导航栏下方,但在底部的选项卡栏下方延伸。第二个选项卡与此相反,从导航栏下方开始,但在底部的选项卡栏之前正确停止
我正在创建并演示TabBarController,如下所示:
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
_todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];
_todoListViewController.delegate = self;
_todoListViewController.title = @"To Do";
_completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];
_completedListViewController.delegate = self;
_completedListViewController.title = @"Completed";
[self setViewControllers:@[_todoListViewController, _completedListViewController]];
然后在tabbar控制器的init
中,创建并添加子(选项卡)视图,如下所示:
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
_todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];
_todoListViewController.delegate = self;
_todoListViewController.title = @"To Do";
_completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];
_completedListViewController.delegate = self;
_completedListViewController.title = @"Completed";
[self setViewControllers:@[_todoListViewController, _completedListViewController]];
我做错了什么
谢谢,
加文
更新:按照建议将以下方法添加到基本视图控制器
:
- (UIRectEdge)edgesForExtendedLayout
{
return UIRectEdgeNone;
}
第一个选项卡的行为已得到改进,并且位置正确,但第二个选项卡保持不变。目前情况如下:
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
_todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];
_todoListViewController.delegate = self;
_todoListViewController.title = @"To Do";
_completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];
_completedListViewController.delegate = self;
_completedListViewController.title = @"Completed";
[self setViewControllers:@[_todoListViewController, _completedListViewController]];
有什么建议吗?
干杯。尝试在视图控制器中实现此方法:
- (UIRectEdge) edgesForExtendedLayout
{
return UIRectEdgeNone;
}
- (id)initWithListController:(BasicListController *)controller
{
self = [super init];
if (self) {
_controller = controller;
_todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];
_todoListViewController.delegate = self;
_todoListViewController.title = @"To Do";
_completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];
_completedListViewController.delegate = self;
_completedListViewController.title = @"Completed";
UINavigationController* ncTodo = [[UINavigationController alloc] initWithRootViewController:_todoListViewController];
UINavigationController* ncCompleted = [[UINavigationController alloc] initWithRootViewController:_completedListViewController];
[self setViewControllers:@[ncTodo, ncCompleted]];
UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneTap:)];
_todoListViewController.navigationItem.leftBarButtonItem = doneButton;
_completedListViewController.navigationItem.leftBarButtonItem = doneButton;
}
return self;
}
问题是由我演示
UITabBarController
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
回到苹果的文档,我不确定这是否是一种有效的方式来展示UITabBarController
。也就是说,将其显示为另一个视图控制器的子视图
不是。以下是一些片段,为我证实了这一点;从这一点,以及由此产生的变化来看,我假设如上所述呈现TabBarController是不正确的
发件人:
在创建选项卡栏界面之前,您需要决定打算如何创建
使用选项卡栏界面。因为它强加了一个包罗万象的
在您的数据组织中,您应该仅在这些特定的
方式:
- 直接将其安装为窗口的根视图控制器
- 将其作为拆分视图界面中的两个视图控制器之一安装。(仅限iPad)
- 从另一个视图控制器以模式显示它
- 从弹出窗口显示它。(仅限iPad)
UITabBarController
作为导航控制器的根视图,是因为我想要导航栏
这就是我现在如何在TabBarController的init中实现的:
- (UIRectEdge) edgesForExtendedLayout
{
return UIRectEdgeNone;
}
- (id)initWithListController:(BasicListController *)controller
{
self = [super init];
if (self) {
_controller = controller;
_todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];
_todoListViewController.delegate = self;
_todoListViewController.title = @"To Do";
_completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];
_completedListViewController.delegate = self;
_completedListViewController.title = @"Completed";
UINavigationController* ncTodo = [[UINavigationController alloc] initWithRootViewController:_todoListViewController];
UINavigationController* ncCompleted = [[UINavigationController alloc] initWithRootViewController:_completedListViewController];
[self setViewControllers:@[ncTodo, ncCompleted]];
UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneTap:)];
_todoListViewController.navigationItem.leftBarButtonItem = doneButton;
_completedListViewController.navigationItem.leftBarButtonItem = doneButton;
}
return self;
}
注意,我不需要做任何事情:
- edgesForExtendedLayout
- 自动调整滚动视图插图
- 扩展布局包括不透明条
iOS 7默认值与导航栏和选项卡栏有关(与上面的原始屏幕截图不同,当
UITabBarController
显示错误时)。有趣的是,这导致了第一个选项卡的正确边界;现在它是完全正确的,位于nag栏和tab栏之间。但第二个选项卡没有更改;它被放置在导航栏下方,但(仍然)没有正确地进入选项卡栏下方。谢谢。这帮了大忙。值得更多的选票!然而,我有时会遇到按钮消失的问题,因此我最终为每个选项卡创建了每个按钮的新实例,以避免将同一个按钮添加到两个不同的视图中。当你想到它时,也许一个视图不应该是另外两个视图的子视图。