UITabBarController中的TableView内容插入

时间:2014-02-22 18:17:49

标签: ios iphone objective-c uitableview uitabbarcontroller

我在UITabBarController中有4个UITableViewController。它们都使用相同的UITableViewController类,但在最后3个控制器上,tableView未正确显示:tableView的顶部显示在navigationBar下,而第一个正确显示

The first UITableViewController embedded in a UITabBarViewController (index 0)

The same UITableViewController at index 1, 2 and 3 :

我尝试通过以编程方式设置“MCVigilanceSingleColorViewController”类(继承自UITableViewController)中的tableView contentInset来解决问题,但它应用于我的四个控制器(然后我的第一个UITableViewController的tableView现在有一个错误的框架...... )。

在故事板中,我的4 UITableViewController也使用相同的类,它们都是一样的:我的4个ViewControllers完全相同。第2,第3和第4个控制器是第一个“复制/粘贴”(我刚刚更改了barItemText)。然后他们都选中了相同的选项并取消选中。顺便说一句,检查“underTopBard”选项对我显示的控制器没有影响。我似乎不明白为什么它们的显示方式不同。

你帮帮我吗? THX。

3 个答案:

答案 0 :(得分:1)

在UINavigationController中嵌入UITableViewController可以解决这个问题。从故事板中可以很容易地完成。只需选择UITableViewController,然后转到Editor>嵌入>导航控制器。

答案 1 :(得分:0)

我遇到了同样的问题,在automaticallyAdjustsScrollViewInsets中包含UIViewController的情况下,这听起来像是与UITabBarController相关的错误。我通过将以下代码添加到viewDidLoad

来解决这个问题
self.automaticallyAdjustsScrollViewInsets = NO;

CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height;
CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
self.internalTableView.contentInset =
  self.internalTableView.scrollIndicatorInsets =
    UIEdgeInsetsMake(statusBarHeight + navigationBarHeight, 0, tabBarHeight, 0);

其中internalTableViewUIScrollView,例如UITableView

答案 2 :(得分:0)

我遇到了同样的问题,在发现没有真正正当理由导致这种情况后,我决定加入“黑客”来解决这个问题......

这就是为什么我添加了这个,它很快但你可以将它转换为objective-c easy:

    var navBarHeight:CGFloat = 0
    if let nc = self.navigationController {
        navBarHeight += nc.navigationBar.frame.height
        navBarHeight += UIApplication.sharedApplication().statusBarFrame.size.height
    }

    //iterate over vc's
    if let vc = self.viewControllers {
        //enumerrate allows for the tuple, setting a key
        for (key, c) in enumerate(vc) {
            //first view displays correctly
            if (key > 0) {
                if let controller = c as? BaseListViewController {
                    controller.automaticallyAdjustsScrollViewInsets = false
                    controller.tableView.contentInset = UIEdgeInsets(
                        top: navBarHeight,
                        left: 0,
                        bottom: 0,
                        right: 0
                    )
                }
            }
        }
    }
    super.viewDidLoad()

这是我的UITabBar的Base类(我明显扩展了它)。 基本上,它检查是否有多个选项卡应该有第二个,++将调整其contentInsets在顶部加上额外的,与navBar +状态栏类似。

我希望这有助于某人。