13

Sto provando a visualizzare un UILabel su un UINavigationController. Il problema è che quando aggiungo UILabel come sottoview di UIWindow non ruoterà automaticamente poiché non è una sottoview di UIViewController (UIViewController gestisce automaticamente l'aggiornamento delle subview durante le rotazioni).Aggiunta di un UINavigationController come sottoview di UIView

Questa è la gerarchia che stavo usando:

  • UIWindow
    • UILabel
    • UINavigationController

Stavo pensando che potrei usare la seguente gerarchia:

  • UIWindow
    • UIViewController
      • UIView
        • UILabel
        • UINavigationController

In questo modo è possibile visualizzare l'etichetta sopra la barra di UINavigationController mentre viene automaticamente ruotata poiché è una sottoview di UIViewController.

Il problema è che quando provo aggiungendo un UINavigationController come una visualizzazione secondaria di vista:

[myViewController.view addSubview:myNavigationController.view]; 

apparirà 20 pixel verso il basso. Il che credo sia perché pensa che sia necessario lasciare spazio alla barra di stato. Tuttavia, poiché UINavigationController viene inserito in un UIView che non si sovrappone alla barra di stato, aggiunge in modo non corretto altri 20 pixel. In altre parole, la parte superiore di UINavigationBar si trova sul contrassegno di 40 pixel dello schermo anziché 20 pixel.

C'è un modo semplice per spostare semplicemente UINavigationController e tutti i suoi elementi (ad esempio barra di spostamento, barra degli strumenti, controller di visualizzazione radice) fino a 20 pixel? O per far sapere che non dovrebbe compensare una barra di stato?

In caso contrario, credo che avrei bisogno di utilizzare la mia prima gerarchia di cui sopra e capire come ruotare l'etichetta in modo coerente con la rotazione della barra di navigazione. Dove posso trovare ulteriori informazioni su come farlo?

Nota: con "visualizzazione di un'etichetta nella parte superiore della barra di navigazione", voglio dire che deve sovrapporsi alla barra di navigazione ... non può semplicemente essere avvolto in un elemento del pulsante della barra e inserito come gli elementi della barra di navigazione.

risposta

18

Utilizzando questo codice sembra funzionare:

nav.view.frame = CGRectMake(nav.view.frame.origin.x, nav.view.frame.origin.y - 20, 
          nav.view.frame.size.width, nav.view.frame.size.height); 

ho fatto questo prima di aggiungere il controller di navigazione come una visualizzazione secondaria. Usare l'applicazione [UIApplication sharedApplication] .statusBarFrame invece del codice 20 potrebbe essere una buona idea.

Non sono sicuro che sia il modo migliore per farlo.

+5

uso nav.view.frame = CGRectMake (0,0, self.view.frame.size.width, auto .view.frame.size.height); \t per fare questo funziona anche su ipad, che non ha il bug +20 ma ha altri problemi con larghezza e altezza, nel complesso questo è un crock totale, molto sciatto di apple – valexa

+2

Ho un'istanza in cui se carico un UINavigationController vista come una sottoview in modalità orizzontale su iPad, ottengo il bug da 20 pixel. Ma solo la prima volta. Posso aggiungere nuovamente il superview in un secondo momento e il problema scomparirà. Molto, molto frustrante. –

+0

Sembra che abbia lo stesso problema. Niente mi sta dicendo che la barra di navigazione ha un offset di 20 pixel in verticale. @ DanielelWood condivido davvero la tua frustrazione. Se spingo e poi pop un altro controller, va tutto bene, ma la prima volta ... provo a giocare. – Vaseltior

2

Se si desidera una cornice che rappresenti l'area del contenuto disponibile, utilizzare semplicemente: [[UIScreen mainScreen] applicationFrame]. Ovviamente, questo limita il tuo controller di visualizzazione di primo livello in modo che possa essere solo di primo livello. Quindi ancora un po 'losco, ma meno così.

2

Perché non usi App Frame invece di aggiungere alcuni valori alle origini? Voglio dire utilizzando:

CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 

come un quadro di riferimento, e fare qualcosa di simile:

nav.view.frame = CGRectMake(appFrame.origin.x, appFrame.origin.y, ... 

Questo ha funzionato per me.

0

Ho avuto questo stesso problema ma sono riuscito a risolverlo.

Ho notato che la vista del mio controller di visualizzazione aveva il frame corretto, ma la barra di navigazione del controller di visualizzazione no (aveva un'origine di frame di (0,20)).

Inserire questo nel controllo della vista che è il superview del controller di navigazione:

- (void) viewDidAppear:(BOOL)animated { 
    if (navigationController.navigationBar.frame.origin.y != 0) { 
     [[navigationController view] removeFromSuperview]; 
     [[self view] addSubview:navigationController.view]; 
    } 
}