iOS 7 | Barra di navigazione / Pulsanti della barra degli strumenti molto vicini alla barra di stato

Ho un problema durante il trascinamento di una barra di navigazione o barra degli strumenti (storyboard) al mio controller di visualizzazione.

UINavigationBar:

UINavigationBar

Come puoi vedere nell’immagine sopra, il pulsante destro è quasi sovrapposto alla barra di stato.

Con un UIToolbar succede lo stesso:

UIToolbar

I controller di questa vista sono pensati per essere usati come modali, questo è il motivo per cui non sto usando un UINavigationController.

In un’altra sezione utilizzo un UINavigationController e appare come mi aspetto:

UINavigationController

Come posso trascinare una UINavigationBar / UIToolbar su un controller di visualizzazione senza sovrapporre la barra di stato?

    Le barre di navigazione o le barre degli strumenti devono trovarsi a (0, viewController.topLayoutGuide.length ) con il posizionamento della barra di UIBarPositionTopAttached . È necessario impostare il delegato della barra di navigazione o della barra degli strumenti sul controller di visualizzazione e restituire UIBarPositionTopAttached . Se posizionato correttamente, otterrai il risultato nella terza immagine.

    Maggiori informazioni qui: https://developer.apple.com/documentation/uikit/uibarpositioningdelegate?language=objc

    Fai questi passaggi

    Trascina il NavigationBar sul ViewController in Xib, imposta il ViewController come suo delegato. Si noti che NavigationBar dovrebbe essere a (0, 20)

    In ViewController, conforms a UINavigationBarDelegate

     @interface ETPViewController ()  

    Implementa questo metodo

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

    positionForBar dice al NavigationBar se dovrebbe estendere il suo sfondo verso l’alto la barra di stato

    Si prega di vedere la mia risposta qui, ho copiato il contenuto qui sotto per comodità:

    https://stackoverflow.com/a/18912291/1162959

    La soluzione più semplice che ho trovato è quella di avvolgere il controller di visualizzazione che si desidera presentare all’interno di un controller di navigazione e quindi presentarlo come controller di navigazione.

     MyViewController *vc = [MyViewController new]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc]; [self presentViewController:nav animated:YES completion:NULL]; 

    vantaggi:

    • Nessun mucking con frame necessari.
    • Lo stesso codice funziona su iOS 6 e iOS 7.
    • Meno brutto degli altri metodi alternativi.

    svantaggi:

    • Probabilmente vorrai lasciare il tuo XIB vuoto di barre di navigazione o barre degli strumenti e aggiungere UIBarButtonItems alla barra di navigazione. Fortunatamente questo è abbastanza facile.

    È ansible risolvere questo problema utilizzando Auto Layout, come da questa nota tecnica (Impedire alla barra di stato di coprire le visualizzazioni).

    Ecco alcuni estratti:

    Aggiungi il vincolo di spazio verticale alla vista più in alto

    • Controllo del trascinamento da UIToolbar alla “Guida al layout top”
    • Nel popover, seleziona “Spaziatura verticale”
    • Cambia la costante “Vincolo dello spazio verticale” a 0 (zero)

    Se si dispone di altre visualizzazioni secondarie sotto UIToolbar, ancorare tali viste alla barra degli strumenti anziché alla Guida al layout principale

    Questo supporterà ios6 e ios7.

    Puoi anche gestirlo aumentando l’altezza della barra di navigazione fornendo un’immagine della dimensione 620×128 per la versione di ios. E questa immagine è usata in:

     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)?YES:NO) { [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"newImage.png"] forBarMetrics:UIBarMetricsDefault]; }else{ [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"previousImage.png"] forBarMetrics:UIBarMetricsDefault]; } 

    Mi sono arreso e ho dovuto impostare il vincolo di altezza della barra su 64 in xx basato su VC perché viewController.topLayoutGuide.length è 0 in viewDidLoad nonostante sia presente la barra di stato: – [che significa in un’applicazione non universale su ipad avresti 20 px nella parte superiore della vista sprecata (perché la barra di stato è separata dalla finestra di simulazione iphone)