我有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];
答案 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;
}
在上面的代码示例中,BrowserViewController
是UIViewController
的子类,StoresViewController
类是UITableViewController
的子类。 UITabBarController
和UINavigationController
实例以编程方式创建并添加到窗口中。
通过继承UITableViewController
类,您可以避免以编程方式创建UITableView
实例,并获得开箱即用的所有内容。
当您需要将详细信息视图推送到UINavigationController
实例的堆栈时,您只需使用与此类似的内容:
[self.navigationController pushViewController:YourDetailViewControllerInstance animated:YES];
这会将详细视图UIViewController
子类添加到UINavigationController
实例的视图层次结构中,并为转换设置动画。
这里有很多控制器,但这完全是值得的,并且会避免你遇到的很多问题,因为这种方法允许视图管理调整大小并自行考虑工具栏/导航栏。