UITabBarController - Child(Tab)ViewControllers的不正确和不一致的界限

Gav*_*ope 7 uitabbarcontroller ios ios7

我有UITabBarController两个选项卡.每个标签都是一个UITableViewController.

UITabBarController出现时,这两个选项卡视图中的每个不正确的边界.第一个选项卡正确位于导航栏下方,但延伸到底部的选项卡栏下方.第二个选项卡是另一种方式,从导航栏下方开始,但在底部的选项卡栏之前正确停止.

在此输入图像描述

我正在创建和呈现TabBarController,如下所示:

ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
Run Code Online (Sandbox Code Playgroud)

然后在initTabBarController中,创建并添加子(tab)视图,如下所示:

_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]];
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

谢谢,加文

更新:按照建议添加以下方法BasicTableViewController:

- (UIRectEdge)edgesForExtendedLayout
{
    return UIRectEdgeNone;
}
Run Code Online (Sandbox Code Playgroud)

第一个选项卡的行为已得到改进并且位置正确,但第二个选项卡保持不变.现状如下:

在此输入图像描述

有什么建议?干杯.

Gav*_*ope 3

问题是由我呈现的方式引起的UITabBarController

\n\n
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];\nUINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];\n[self presentViewController:nc animated:YES completion:^(){}];\n
Run Code Online (Sandbox Code Playgroud)\n\n

回到 Apple 的文档,我不确定这是否是呈现UITabBarController. 也就是说,将其呈现为另一个视图控制器的子级。

\n\n

它不是。以下是一些为我证实的片段;由此以及由此产生的更改,我假设像上面那样呈现 TabBarController 是不正确的。

\n\n

来自:\n https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/TabBarControllers.html

\n\n
\n

在创建选项卡栏界面之前,您需要决定如何使用选项卡栏界面。由于它对您的数据强加了一种总体组织,因此您应该仅以以下特定方式使用一种组织:

\n\n
    \n
  • 直接将其安装为window\xe2\x80\x99s根视图控制器。
  • \n
  • 将其安装为分割视图界面中的两个视图控制器之一。(仅限 iPad)
  • \n
  • 从另一个视图控制器以模态方式呈现它。
  • \n
  • 从弹出窗口显示它。(仅限 iPad)
  • \n
\n
\n\n

来自:\n https://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html

\n\n
\n

与其他视图控制器不同,标签栏界面永远不应该安装为另一个视图控制器的子级。

\n
\n\n

并进一步澄清:

\n\n
\n

选项卡栏控制器是一个容器视图控制器,可用于将应用划分为两种或多种不同的操作模式。

\n\n

导航控制器呈现按层次结构组织的数据,并且是 UINavigationController 类的实例。此类的方法提供对管理基于堆栈的 内容视图控制器集合的支持。

\n
\n\n

我之所以将其呈现UITabBarController为导航控制器的根视图,是因为我想要导航栏......

\n\n

这就是我现在在 TabBarController 的 init 中实现这一目标的方法:

\n\n
- (id)initWithListController:(BasicListController *)controller\n{\n    self = [super init];\n    if (self) {\n        _controller = controller;\n\n        _todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];\n        _todoListViewController.delegate = self;\n        _todoListViewController.title = @"To Do";\n\n        _completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];\n        _completedListViewController.delegate = self;\n        _completedListViewController.title = @"Completed";\n\n        UINavigationController* ncTodo = [[UINavigationController alloc] initWithRootViewController:_todoListViewController];\n        UINavigationController* ncCompleted = [[UINavigationController alloc] initWithRootViewController:_completedListViewController];\n\n        [self setViewControllers:@[ncTodo, ncCompleted]];\n\n        UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneTap:)];\n        _todoListViewController.navigationItem.leftBarButtonItem = doneButton;\n        _completedListViewController.navigationItem.leftBarButtonItem = doneButton;\n    }\n    return self;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意,我不需要做任何事情:

\n\n
    \n
  • 扩展布局的边缘
  • \n
  • 自动调整ScrollViewInsets
  • \n
  • 扩展布局包括不透明条
  • \n
\n\n

iOS 7 默认尊重导航栏和标签栏(与上面的原始屏幕截图不同,当时的屏幕截图UITabBarController显示不正确)。

\n