UITableViewController inside UITabBarController inside UINavigationController

My problem

I am using a UITabBarController inside a UINavigationController. There are three tables inside the UITabBarController. As shown in the figure, the first view of the table is displayed correctly, while the other two views of the table are partially hidden behind the navigation panel. How can i fix this?

enter image description hereenter image description hereenter image description here

My hierarchy:

  • Root: UINavigationController
    • UITabBarController
      • UITableViewController (table1, table2, table3)

Here is my code:

AppDelegate.m

#import "AppDelegate.h"
#import "TableViewController.h"
@interface AppDelegate()
@property UINavigationController* nav;
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    TableViewController* table1 = [[TableViewController alloc]init];
    TableViewController* table2 = [[TableViewController alloc]init];
    TableViewController* table3 = [[TableViewController alloc]init];
    table1.title = @"table1";
    table2.title = @"table2";
    table3.title = @"table3";
    UITabBarController* t = [[UITabBarController alloc] init];
    [t setViewControllers:@[table1,table2,table3]];
    self.nav = [[UINavigationController alloc] initWithRootViewController:t];
    [self.window setRootViewController:self.nav];
    [self.window makeKeyAndVisible];
    return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application{}
- (void)applicationDidEnterBackground:(UIApplication *)application{}
- (void)applicationWillEnterForeground:(UIApplication *)application{}
- (void)applicationDidBecomeActive:(UIApplication *)application{}
- (void)applicationWillTerminate:(UIApplication *)application{}
@end

TableViewController.m

#import "TableViewController.h"
@implementation TableViewController
- (id)initWithStyle:(UITableViewStyle)style{
    self = [super initWithStyle:style];
    if (self) {}
    return self;
}
- (void)viewDidLoad{
    [super viewDidLoad];
    [self.tabBarController.view layoutSubviews];
}
- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
}
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell* c = [[UITableViewCell alloc] init];
    [c.textLabel setText:[NSString stringWithFormat:@"%d", indexPath.row]];
    return c;
}
@end
+4
source share
2 answers

Usually a hierarchy

UITabBarController
    - UINavigationController
        - UITableViewController

? , , .

+5

. , , :

DRTabBarController.h

//
// Created by Dan Rosenstark on 2/28/15.
// Copyright (c) 2015 Confusion Studios LLC. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface DRTabBarController : UIViewController <UITabBarDelegate>;

@property (nonatomic, strong) NSArray *viewControllers;
@property (nonatomic, strong) UITabBar *tabBar;
@property (nonatomic, strong) UIView *mainView;

@end

DRTabBarController.m

//
// Created by dr2050 on 2/28/15.
// Copyright (c) 2015 Confusion Studios LLC. All rights reserved.
//

#import "DRTabBarController.h"


@implementation DRTabBarController {


}


- (instancetype)init {
    self = [super init];
    if (self) {
        self.tabBar = [[UITabBar alloc] init];
        self.tabBar.delegate = self;
        self.tabBar.tintColor = [UIColor whiteColor];
        self.tabBar.barStyle = UIBarStyleBlack;
        self.tabBar.backgroundColor = [UIColor blackColor];

        self.mainView = [[UIView alloc] init];
    }
    return self;
}

- (void)viewDidLoad {
    [self.view addSubview:self.tabBar];
    [self.view addSubview:self.mainView];
}

- (void)setViewControllers:(NSArray *)viewControllers {
    _viewControllers = viewControllers;

    NSMutableArray *tabBarItems = [NSMutableArray array];
    for (UIViewController *controller in viewControllers) {
        UITabBarItem *item = controller.tabBarItem;
        [tabBarItems addObject:item];
    }
    self.tabBar.items = tabBarItems;
}


- (void)viewWillAppear:(BOOL)animated {
    [self.tabBar setSelectedItem:self.tabBar.items.firstObject];
    [self tabBar:self.tabBar didSelectItem:self.tabBar.items.firstObject];
}

- (void)viewDidAppear:(BOOL)animated {



}

-(void)viewDidLayoutSubviews {
    CGRect frame = self.view.bounds;
    UITabBarController *throwaway = [[UITabBarController alloc] init];
    frame.size.height = throwaway.tabBar.frame.size.height;
    frame.origin.y = self.view.bounds.size.height - frame.size.height;
    self.tabBar.frame = frame;
    self.tabBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;

    frame = self.view.bounds;
    frame.size.height -= self.tabBar.frame.size.height;

    float navbarHeight = self.navigationController.navigationBar.frame.size.height;
    // cannot use UIApplication.sharedApplication.statusBarFrame.size.height because
    // reports are not right with in-call status bar
    float statusBarHeight = UIApplication.sharedApplication.statusBarHidden ? 0 : 20;
    float topBarHeight = navbarHeight + statusBarHeight;

    frame.origin.y += topBarHeight;
    frame.size.height -= topBarHeight;
    self.mainView.frame = frame;
    self.mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
}

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
    int index = [self.tabBar.items indexOfObject:item];
    NSArray *subviews = self.mainView.subviews;
    for (UIView *view in subviews) {
        [view removeFromSuperview];
    }
    UIView *view = [[self.viewControllers objectAtIndex:index] view];
    view.frame = self.mainView.bounds;
    view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.mainView addSubview:view];
}


@end

: - 20 - , nav...

, .

+1

All Articles