由UITabBar部分隐藏的UITableView

时间:2011-09-14 21:17:13

标签: objective-c ios uitableview uinavigationcontroller uitabbarcontroller

我有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。

在Interface Builder中,我使用的是“模拟指标”,它自动将视图的高度设置为367.00。

我有什么遗漏,无论我尝试什么,我都看不到我需要的367.00高度。

作为一个临时解决方案,我手动设置了UITableView的框架,这不是很理想,所以找出为什么这不起作用会很好:

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

2 个答案:

答案 0 :(得分:4)

您应该使用self.view.bounds而不是[[UIScreen mainScreen] applicationFrame],因为最后一个返回整个屏幕框架,而self.view.bounds为您提供了您正在搜索的视图边界。

答案 1 :(得分:2)

您应该将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;
}

在上面的代码示例中,BrowserViewControllerUIViewController的子类,StoresViewController类是UITableViewController的子类。 UITabBarControllerUINavigationController实例以编程方式创建并添加到窗口中。

通过继承UITableViewController类,您可以避免以编程方式创建UITableView实例,并获得开箱即用的所有内容。

当您需要将详细信息视图推送到UINavigationController实例的堆栈时,您只需使用与此类似的内容:

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

这会将详细视图UIViewController子类添加到UINavigationController实例的视图层次结构中,并为转换设置动画。

这里有很多控制器,但这完全是值得的,并且会避免你遇到的很多问题,因为这种方法允许视图管理调整大小并自行考虑工具栏/导航栏。