UITableView частично скрыт UITabBar - PullRequest
5 голосов
/ 15 сентября 2011

У меня есть UITabBarController, который содержит UINavigationController.В пределах видимого UIViewController я создаю UITableView программно следующим образом:

self.voucherTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain];
self.voucherTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;

Однако UITabBar перекрывает UITableView.

Когда я вывожу высотуиз [[UIScreen mainScreen] applicationFrame] он возвращает 460,00, тогда как он должен быть 367,00.

В Интерфейсном Разработчике я использую «Симулированные метрики», которые автоматически устанавливают высоту представления на 367,00.

Есть ли что-то, чего мне не хватает, независимо от того, что я пытаюсь, я не вижу, чтобы получить нужную высоту 367,00.

В качестве временного исправления я установил кадр UITableViewвручную это не совсем идеально, поэтому было бы неплохо понять, почему это не работает:

self.voucherTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 367) style:UITableViewStylePlain];

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Вы должны использовать self.view.bounds вместо [[UIScreen mainScreen] applicationFrame], так как последний возвращает вам весь кадр экрана, тогда как self.view.bounds предоставляет вам границы просмотра, которые выглядят так, как вы ищете.

2 голосов
/ 15 сентября 2011

Вы должны добавить экземпляр UINavigationController к UITabBarController, а затем добавить контроллер табличного представления к свойству rootViewController экземпляра UINavigationController, что должно значительно облегчить вашу жизнь.

В качестве простого примера этого создайте пустое оконное приложение (шаблоны делают это намного более запутанным, чем на самом деле).

Добавьте свои подклассы UIViewController/UITableViewController в проект, а затем используйте этот код в качестве руководства для настройки вашего проекта. Этот код находится в вашем классе AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // create our table view controller that will display our store list    
    StoresViewController *storeListController = [[StoresViewController alloc] init];


    // create the navigation controller that will hold our store list and detail view controllers and set the store list as the root view controller
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:storeListController];
    [navController.tabBarItem setTitle:@"TableView"];
    [navController.tabBarItem setImage:[UIImage imageNamed:@"cart.png"]];


    // create our browser view controller    
    BrowserViewController *webBrowserController = [[BrowserViewController alloc] init];
    [webBrowserController.tabBarItem setTitle:@"WebView"];
    [webBrowserController.tabBarItem setImage:[UIImage imageNamed:@"web.png"]];

    // add our view controllers to an array, which will retain them
    NSArray *viewControllers = [NSArray arrayWithObjects:navController, webBrowserController, nil];


    // release these since they are now retained
    [navController release];
    [storeListController release];
    [webBrowserController release];


    // add our array of controllers to the tab bar controller
    UITabBarController *tabBarController = [[UITabBarController alloc] init];
    [tabBarController setViewControllers:viewControllers];


    // set the tab bar controller as our root view controller    
    [self.window setRootViewController:tabBarController];


    // we can release this now since the window is retaining it
    [tabBarController release];


    [self.window makeKeyAndVisible];

    return YES;
}

В приведенном выше примере кода BrowserViewController является подклассом UIViewController, а класс StoresViewController является подклассом UITableViewController. Экземпляры UITabBarController и UINavigationController создаются программно и добавляются в окно.

Используя подклассы UITableViewController класса, вы избавляетесь от необходимости создавать экземпляр UITableView программно и получаете практически все, что вам нужно, из коробки.

Когда вам нужно поместить подробный вид в стек экземпляра UINavigationController, вы просто должны использовать что-то подобное:

[self.navigationController pushViewController:YourDetailViewControllerInstance animated:YES];

Это добавит подробный подкласс вида UIViewController к иерархии вида экземпляра UINavigationController для вас и оживит переход.

В этом много контроллеров, но оно того стоит и позволит избежать многих проблем, с которыми вы сталкиваетесь, так как этот метод позволяет представлениям управлять изменением размера и учитывать панели инструментов / панели навигации самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...