2009-08-31 8 views
15

Ho una vista che viene caricata in MainWindow.xib. È solo una vista con una visualizzazione a fotogrammi al suo interno che mostra un'immagine su tutto lo schermo (320 X 480). Quando i carichi applicazioni Mi visualizzano questo punto di vista e poi mi fanno unIPhone - UIView addSubview Gap in cima

[self.view addSubview:tabbarController.view]; 

Tab Bar Controller è solo un UITabBarController con 2 Visualizza controllori aggiunti ad esso. Quando aggiunge la vista del tabbarController alla sottoview, lascia una lacuna nella parte superiore di circa 20px. La mia app ha una barra di stato, ma in pratica è spazio per un'altra. Questo accade a meno che non aggiungo questo al mio controller di visualizzazione:

self.view.frame = CGRectMake(0, 0, 320, 480); 

Qualcuno può spiegare questo. Stavo facendo

self.view = tabbarController.view; 

ma mi hanno detto che non dovevo farlo. Quindi ora sto aggiungendo una sottoview, ma non capisco perché devo regolare il CGRect della mia vista per non mostrare il 20px.

risposta

17

UITabBarController si aspetta di avere la sua vista aggiunta come sottoview di UIWindow, non come una sottoview di qualche altro UIView. La proprietà frame definisce l'offset della vista all'interno della sua superview, quindi l'implementazione di UITabBarController compensa il frame della vista di 20 pixel per impostazione predefinita per lasciare spazio alla barra di stato. Stai utilizzando UITabBarController in un modo non standard aggiungendolo a una vista che è già stata sfalsata di 20 pixel per la barra di stato. UITabBarController compensa la sua vista di altri 20 pixel rispetto alla sua superview, causando il divario che vedi.

Un modo pulito per risolvere questo problema è aggiungere punto di vista della UITabBarController come una visualizzazione secondaria della finestra invece di una visione:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view]; 

(Nota: Il metodo keyWindow restituirà solo la vostra finestra se hai già chiamato makeKeyAndVisible. Altrimenti, potresti voler impostare una proprietà finestra sul tuo UIViewController.)

+0

Grazie per la spiegazione chiara. Forse dovrei tornare indietro e ristrutturare parte della mia app. Voglio fare le cose nel modo corretto, ma ho pensato che potrebbe essere meglio separare la logica del controller di visualizzazione dal delegato dell'app - quindi il mio controller di visualizzazione radice fa tutto ciò di cui ha bisogno. Questo spiegherebbe perché nel mio controller della vista di root, se ho fatto self.view = tabbarController.view invece di aggiungere come sottoview, non otterrei il divario. Bella risposta. Potrei votare di più se potessi. – Brian

+0

Sembra che il tuo istinto sia andato bene qui. Questo è solo uno di quei limiti di design in Cocoa Touch che dobbiamo lavorare per ora. Ricorda però che non è necessario aggiungere il tabbarController.view alla tua finestra dal delegato dell'app. Puoi aggiungerlo nel tuo controller di visualizzazione se è lì che pensi che abbia più senso. È sufficiente avere accesso all'oggetto della finestra, tramite il metodo keyWindow, oppure impostandolo come proprietà sul controller in applicationDidFinishLaunching :. – cduhn

+0

ma questo non significa che il tabbarcontroller.view sia ora una sottoview di window.view? Ma nel mio caso non è corretto ho una visualizzazione annuncio e quindi una seconda contentview. E sto aggiungendo il tabbarcontroller.view alla contentview. In questo modo il viewcontroller gestirà il contenuto/adview in base agli annunci. se aggiungo il tabbarcontroller.view alla finestra, non penso che sarò in grado di gestire le viste usando il mio viewcontroller. cosa ne pensi? – LolaRun

Problemi correlati