Posizione della barra di navigazione per la vista modale – iOS7

In un controller di navigazione, si ottiene automaticamente il colore e la posizione corretti di una barra di navigazione come previsto.

come questo

inserisci la descrizione dell'immagine qui

Ma in modalità modale, quando si trascina in una barra di navigazione, è ansible posizionarlo direttamente in alto, che è troppo vicino alle informazioni sull’operatore / batteria.

inserisci la descrizione dell'immagine qui

Quindi puoi trascinarlo verso il basso, indovina fino a che punto corrisponde alla posizione di quello creato automaticamente, ma poi hai una discrepanza di colore. Ho provato a cambiare le impostazioni della barra di stato in IB, non fa la differenza.

inserisci la descrizione dell'immagine qui

C’è un modo corretto per ovviare a questo, come nel fare in modo che una vista modale assomigli alla vista di navigazione generata automaticamente.

Grazie

Il modo migliore per superare questo problema in iOS 7 è conformarsi al nuovo protocollo UIBarPositioningDelegate .

Connetti il ​​delegato della tua NavigationBar al tuo controller di visualizzazione (imposta il controller di visualizzazione come delegato per la barra di navigazione tramite storyboard o tramite codice) e si conforma a tale protocollo e implementando il metodo

-(UIBarPosition)positionForBar:(id)bar { return UIBarPositionTopAttached; }

È ansible rimuovere la fessura superiore nel controller della vista. È necessario posizionare la barra di 20 punti sotto il bordo superiore

Capito le 3 opzioni per risolvere questo problema.

Opzione 1: ridimensiona la barra di navigazione

 float currentVersion = 7.0; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) { // iOS 7 self.navBar.frame = CGRectMake(self.navBar.frame.origin.x, self.navBar.frame.origin.y, self.navBar.frame.size.width, 64); } 

Opzione 2: nascondi la barra di stato

Ad esempio, nella vista modale in cui si desidera hide la barra di stato

Aggiungi questo metodo

 - (BOOL)prefersStatusBarHidden { return YES; } 

In viewDidLoad add

 float currentVersion = 7.0; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) { [self prefersStatusBarHidden]; [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; } else { [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; } 

Ora, quando si chiude la vista modale e si desidera tornare indietro. Aggiungi questo in viewWillAppear

  float currentVersion = 7.0; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) { [self prefersStatusBarHidden]; [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; NSLog(@"ios7"); } else { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; } 

e questo, ma restituire NO questa volta

 - (BOOL)prefersStatusBarHidden { return NO; } 

Opzione 3: incorporare in Nav Controller

Seleziona la tua vista modale, incorporala in un controller di navigazione.

inserisci la descrizione dell'immagine qui

In Swift :

Il modo migliore per superare questo problema in iOS 8.1 e Swift è conformarsi al nuovo protocollo UIBarPositioningDelegate.

Connetti il ​​delegato della tua NavigationBar al tuo controller di visualizzazione e si conforma a tale protocollo e chiamando il metodo:

 func positionForBar(bar: UIBarPositioning) -> UIBarPosition { return UIBarPosition.TopAttached } 

È ansible rimuovere la fessura superiore nel controller della vista. È necessario posizionare la barra di 20 punti sotto il bordo superiore.

Per Swift3 usa il seguente ..

 func position(for bar: UIBarPositioning) -> UIBarPosition{ return .topAttached; } 

Dopo alcuni tentativi di spostare la barra di navigazione di alcuni pixel verso il basso in iOS 7, questo è ciò che alla fine ha funzionato per me:

 -(void)viewWillLayoutSubviews { float iosVersion = 7.0; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) { // iOS 7+ CGRect viewFrame = self.view.frame; viewFrame.origin.y += 10; self.view.frame = viewFrame; } } 

Ho anche regolato il colore della barra di stato per abbinare meglio il mio contenuto:

 -(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; } 

Ho creato un controller di navigazione, cancellato il “Root View Controller” che appariva con esso. Quindi tieni premuto ctrl e trascina il “Controller di navigazione” sulla tua vista (elimina la barra di navigazione che hai aggiunto manualmente prima). Imposta il controller di navigazione come “Controller vista iniziale” e ora funziona correttamente.

Ho distriggersto “Use Autolayout” e ha funzionato per me.