Come impedire a UINavigationBar di coprire la parte superiore della vista in iOS 7?


99

Dopo l'aggiornamento a Xcode 5, le barre di navigazione in tutte le visualizzazioni della mia app si sono spostate verso il basso. Ecco alcuni screenshot, il primo mostra tutto nella vista mentre viene tirato giù, e il secondo mostra tutto intatto. La barra di ricerca dovrebbe iniziare dove si trova la barra di navigazione.

Tutti i contenuti Tutto il contenuto inattivo

Qualcuno sa come posso risolvere questo problema?

modifica: ho provato questa raccomandazione in precedenza:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Ma produce risultati molto strani.

Tentativo di soluzione

Ciò può essere dovuto al fatto che ho un "menu diapositiva" sotto questo controller di visualizzazione che appare a causa della trasparenza della barra di navigazione.


Ecco un'altra soluzione per questo problema. stackoverflow.com/a/51491645/10148333
Afonso

Risposte:


235

Imposta la proprietà traslucida della barra di navigazione su NO :

self.navigationController.navigationBar.translucent = NO;

Ciò risolverà la visualizzazione dall'inquadratura sotto la barra di navigazione e la barra di stato.

Se devi mostrare e nascondere la barra di navigazione, usa

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

nel tuo viewDidLoadmetodo.


1
L'ho messo sotto viewDidLoadma non produce modifiche.
Sam D20

13
rendilo in viewDidLayoutSubviews funtions
Hindu

1
Aggiungere questo a viewDidLayoutSubviews ha funzionato. Apprezzo l'aiuto signori!
Sam D20

Ciao, qualche domanda? o è un complimento?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; mi ha aiutato
luky

32

Per iOS 7impostazione predefinita, tutto il valore della proprietà traslucente del controller è SÌ, quindi per questo problema si imposta la proprietà traslucente su NO .

self.navController.navigationBar.translucent = NO;

2
Non esiste una proprietà "navController". Usa questo: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

creo l'oggetto navigtionbarcontroller in app delegate e do il nome navController.
Sumit Mundra

21

Puoi disabilitare "Estendi bordi" nell'ispettore Attributi del controller di visualizzazione di questa schermata (come mostrato nell'immagine sotto):

inserisci qui la descrizione dell'immagine


12

Funziona anche con swift su iOS 8.1

navigationController?.navigationBar.translucent = false

8

Se vuoi mantenere la traslucenza sul tuo navigationBar, alla fine del tuo viewDidLoado nel tuo viewWillAppearaggiungi questa riga di codice:

[self.view sendSubviewToBack:self.tableView]

In qualche modo se la vostra scrollViewsottoclasse ( UITableView, UICollectionView, etc.) è a index0 nella vista corrente subviews, regola automaticamente i inserti secondo la vostra navigationBar. E non dovrebbe influire sulla tua interfaccia utente nelle versioni precedenti a iOS7.


MODIFICA Se si inizializza a livello di UITableViewcodice, è meglio aggiungerlo alla vista utilizzando questo[self.view insertSubview:self.tableView atIndex:0];


Questa dovrebbe essere la risposta corretta. Se stai aggiungendo la sottoview a livello di codice, puoi semplicemente farlo [self.view insertSubview:self.tableView atIndex:0];invece di inviarlo sul retro dopo averlo aggiunto.
smitt04

Corretta. Ma senza sapere come sta avviando il suo controller (programmaticamente, costruttore di interfacce), non possiamo presumere che sia la soluzione migliore. Anche se ho modificato la mia risposta.
jbouaziz

Funziona ma sembra un trucco. C'è qualche avviso nella documentazione ufficiale su questo?
John Tracid

4

Swift 4 :

Imposta la seguente riga di codice nel metodo viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

3

Puoi aggiungere questo metodo nel tuo controller di visualizzazione come mostrato in questo URL :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Un altro approccio consiste nell'impostare self.automaticallyAdjustsScrollViewInsets = YES;sul controller della vista. Questo è abilitato per impostazione predefinita. Ma nel tuo caso:

Vedo che stai usando EGORefreshHeaderView. Gioca con contentInset di UITableView. Quindi, quando lo rilasci, l'intestazione ripristinerà il riquadro superiore invece di ripristinare il valore precedente.


-1

Se vuoi avere il controllo completo sulle visualizzazioni ed evitare regolazioni errate di iOS, sottoclasse UITableView e regola gli inserti (sia di scorrimento che di indicatori) in - (void) willMoveToWindow: (UIWindow *) newWindow. Per me va bene.


-4

Un'altra opzione è aprire il file Info.plist in modalità codice sorgente e inserire le seguenti informazioni:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

Spero che questo ti aiuti.


1
Non credo che questo influenzerebbe affatto la vista.
Enrico Susatyo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.