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

时间:2014-01-09 21:47:30

标签: ios ios7 uitabbarcontroller

我有UITabBarController个标签。每个标签都是UITableViewController

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

enter image description here

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

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

然后在TabBarController的init中,创建并添加子(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]];

我做错了什么?

谢谢, 加文

更新:根据建议将以下方法添加到BasicTableViewController

- (UIRectEdge)edgesForExtendedLayout
{
    return UIRectEdgeNone;
}

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

enter image description here

有什么建议吗? 欢呼声。

2 个答案:

答案 0 :(得分:3)

问题是由于我呈现 UITabBarController

的方式造成的
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];

回到Apple的文档,我不确定这是否是提出UITabBarController的有效方式。也就是说,将其呈现为另一个视图控制器的子节点。

不是。以下是为我确认的一些片段;从这一点,以及由此产生的变化,我假设在上面提供一个TabBarController是不正确的。

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

  

在创建标签栏界面之前,您需要确定自己的意图   使用标签栏界面。因为它强加了一个总体   对您的数据进行组织,您应该只使用这些特定的数据   方法:

     
      
  • 直接将其安装为窗口的根视图控制器。
  •   
  • 在拆分视图界面中将其安装为两个视图控制器之一。 (仅限iPad)
  •   
  • 从另一个视图控制器以模态方式显示它。
  •   
  • 从弹出窗口显示它。 (仅限iPad)
  •   

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

  

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

进一步澄清:

  

标签栏控制器是您使用的容器视图控制器   将您的应用划分为两种或更多种不同的操作模式。

     

导航控制器显示按层次结构组织的数据   并且是UINavigationController类的一个实例。的方法   此类为管理基于堆栈的集合提供支持   内容查看控制器。

我将UITabBarController作为导航控制器的根视图呈现的原因是我想要导航栏......

这就是我现在在TabBarController的初始化中实现的目的:

- (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
  • automaticallyAdjustsScrollViewInsets
  • extendedLayoutIncludesOpaqueBars

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

答案 1 :(得分:1)

尝试在视图控制器中实现此方法:

- (UIRectEdge) edgesForExtendedLayout
{
    return UIRectEdgeNone;
}