5

我有一個UITabBarController其中包含UINavigationController。在可見UIViewController,我創建一個UITableView編程方式如下:UITableView部分隱藏UITabBar

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]; 
+0

也許你應該檢查tableView的autoSizingMasks – ender

+0

我已經更新了我的原始帖子,並設置了'autoresizingMask'的值。 –

回答

4

你應該使用self.view.bounds而不是[[UIScreen mainScreen] applicationFrame]作爲最後一個返回給你整個屏幕框架,而self.view.bounds爲你提供你的視圖邊界,看起來你正在尋找什麼。

+0

我試着輸出self.view.bounds.size.height的值,它又返回了460.00。 –

+2

你打算怎麼做。它將在 - (void)viewDidAppear中更新:(BOOL)動畫; (可能在 - (void)viewWillAppear:(BOOL)動畫;也可以,但我不確定) – Ariel

+0

另一件你應該知道的東西是wantFullScreenLayout屬性。如果你爲你的UIViewController設置爲YES,它會更新你的視圖,而不需要考慮標籤欄。 – Ariel

2

您應該UINavigationController實例添加到UITabBarController然後表視圖控制器添加到UINavigationController實例,它應該讓你的生活變得更加簡單的rootViewController財產。

作爲一個簡單的例子,創建一個空的基於窗口的應用程序(模板使這個有很多更混亂比它確實是)。

添加您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一個子類。 UITabBarControllerUINavigationController實例以編程方式創建並添加到窗口中。

通過繼承UITableViewController類,您可以避免以編程方式創建UITableView實例,並獲得開箱即用所需的大部分內容。

當你需要推動一個細節欣賞到UINavigationController實例的堆棧,你只需要類似這樣使用的東西:

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

這將詳細視圖UIViewController子類添加到UINavigationController實例的視圖層次爲你併爲過渡創造動力。

很多控制器在這個,但它是完全值得的,將避免很多你遇到的問題,因爲這種方法允許視圖管理調整大小,並把工具欄/導航欄全部考慮到他們自己。