5

Ho uno che contiene uno UINavigationController. All'interno del visibile UIViewController, Sto creando un UITableView programatically come segue:UITableView parzialmente nascosto da UITabBar

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

Tuttavia, l'UITabBar si sovrappone l'UITableView.

Quando output l'altezza dello [[UIScreen mainScreen] applicationFrame], restituisce 460,00 mentre dovrebbe essere 367,00.

In Interface Builder, sto utilizzando le "Metriche simulate" che impostano automaticamente l'altezza della vista su 367,00.

C'è qualcosa che mi manca, non importa quello che provo Non riesco a vedere per ottenere l'altezza di 367,00 che mi serve.

come una correzione temporanea, ho impostato il telaio della UITableView manualmente, questo non è proprio l'ideale, quindi sarebbe bello lavorare perché questo non sta funzionando:

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

Forse dovresti controllare il AutoSizingMasks del tavoloView – ender

+0

Ho aggiornato il mio post originale con quello che sto impostando il valore di 'autoresizingMask' su. –

risposta

4

Si dovrebbe usa self.view.bounds piuttosto che [[UIScreen mainScreen] applicationFrame] poiché l'ultimo ti restituisce l'intero frame screen mentre self.view.bounds ti fornisce i limiti di visualizzazione che sembrano quello che stai cercando.

+0

Ho provato a generare il valore di self.view.bounds.size.height e di nuovo restituito 460,00. –

+2

Dove stai cercando di farlo. Verrà aggiornato in - (void) viewDidAppear: (BOOL) animato; (forse in - (void) viewWillAppear: (BOOL) animato, anche, ma non ne sono sicuro) – Ariel

+0

Un'altra cosa di cui dovresti essere a conoscenza è la proprietà wantsFullScreenLayout. Se lo si imposta su SÌ per il tuo UIViewController, aggiornerà la tua vista in modo indipendente senza tenere conto della barra delle linguette. – Ariel

2

si dovrebbe aggiungere l'istanza UINavigationController al UITabBarController e quindi aggiungere un controller della vista tabella per la rootViewController proprietà dell'istanza UINavigationController che dovrebbe rendere la vita molto più facile.

Come semplice esempio di ciò, creare un'applicazione vuota basata su finestra (i modelli rendono questo molto più confuso di quanto non sia in realtà).

Aggiungi le sottoclassi UIViewController/UITableViewController al progetto quindi utilizza questo codice come guida per l'impostazione del progetto. Questo codice è nella classe 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; 
} 

Nel codice di esempio sopra il BrowserViewController è una sottoclasse di UIViewController e la classe StoresViewController è una sottoclasse di UITableViewController. Le istanze UITabBarController e UINavigationController vengono create a livello di codice e aggiunte alla finestra.

Sottoclasse la classe UITableViewController evitando di dover creare un'istanza UITableView a livello di codice e ottenere tutto ciò che è necessario fuori dalla scatola.

Quando è necessario spingere una vista di dettaglio sulla pila dell'istanza UINavigationController, basta usare qualcosa di simile a questo:

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

questo aggiungerà la sottoclasse vista di dettaglio UIViewController alla gerarchia della vista dell'istanza UINavigationController per voi e animare la transizione.

Un sacco di controller in questo, ma ne vale la pena ed eviterà molti dei problemi che si verificano in quanto questo metodo consente alle viste di gestire il ridimensionamento e di prendere in considerazione barre degli strumenti/barre di navigazione tutto da soli.

Problemi correlati