La barra di navigazione viene visualizzata sulle viste con il nuovo SDK iOS7


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

Nelle versioni precedenti funziona correttamente. La barra di ricerca viene visualizzata sotto la statusbarbarra di navigazione e. La tableviewsta comparendo sotto la barra di ricerca

Ma quando lo eseguo Xcode 5 sdk iOS 7, la barra di ricerca non è visibile (penso che sia posizionata sotto la barra di stato e la barra di navigazione), e anche la barra di navigazione appare sopra la vista tabella.

Verrà risolto con iOS 7una versione stabile?

O è il problema della mia codifica?

O dovremmo gestirlo aggiungendo il (y = statubar height + nav bar height)valore y per iOS 7?

Di recente ho scaricato Xcode 5 DP per testare le mie app in iOS 7. La prima cosa che ho notato e confermato è che i limiti della mia vista non sono sempre ridimensionati per tenere conto della barra di stato e della barra di navigazione.

In viewDidLayoutSubviews, stampo i limiti della vista:

{{0, 0}, {320, 568}}

In questo modo i miei contenuti vengono visualizzati sotto la barra di navigazione e la barra di stato.

So che potrei spiegare l'altezza da solo ottenendo l'altezza dello schermo principale, sottraendo l'altezza della barra di stato e l'altezza della barra di navigazione, ma sembra un lavoro extra non necessario.

Qualcun altro ha riscontrato questo problema?

AGGIORNARE:

Ho trovato una soluzione per questo problema specifico. 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.

Tuttavia, non ho trovato una soluzione per il caso in cui desideri che la barra di navigazione sia traslucida. Ad esempio, visualizzando una foto a schermo intero, desidero che la barra di navigazione sia traslucida e che la vista sia incorniciata al di sotto di essa. Funziona, ma quando si attiva / disattiva la visualizzazione della barra di navigazione, ho riscontrato risultati ancora più strani. La prima sottoview (a UIScrollView) ottiene i suoi limiti y origine cambiata ogni volta.


4
Software beta. I forum degli sviluppatori Apple sono più appropriati. Inoltre, il problema è esplicitamente menzionato nella guida alla transizione.
Sulthan

Risposte:


188

Non è del tutto vero. È stata introdotta una nuova proprietà in iOS 7 che consente di regolare il comportamento del layout come nelle versioni precedenti di iOS. Inserisci questo pezzo di codice nel tuo controller di visualizzazione e dovresti essere a posto! Lo spazio occupato dalla barra di navigazione dovrebbe essere considerato automaticamente

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

Devi aggiungere quanto sopra nel tuo -(void)viewDidLoadmetodo.

Nota: dovresti utilizzare l'ultima versione GM di iOS 7 e Xcode 5 ora poiché l'API è cambiata dalle versioni beta.


nel mio codice dice edgeForExtendedLayout. Uso dell'identificatore non dichiarato UIExtendedEdgeNone. Per favore aiuto.

6
È cambiato in UIRectEdgeNone
Simon

6
Questo è esattamente il motivo per cui una domanda del genere non dovrebbe essere posta o risposto qui.
Sulthan

Non capisco perché se vuoi mantenere la compatibilità con ios6 sei costretto a introdurre un caso condizionale tramite codice per verificare se il controller ha quella proprietà o meno ..
jerrygdm

12
Sembra funzionare solo se la visualizzazione è incorporata in un UINavigationController.
pojo

37

Screenshot dallo storyboard

Se stai lavorando in Storyboard (che consiglio vivamente!) Questa è la soluzione: puoi disabilitare "Estendi bordi" del tuo ViewController nello storyboard. Devi farlo per ogni viewController. Puoi disabilitare i bordi estesi facendo clic sull'icona viewController nello stortyboard (oltre al productOwner sotto la vista stessa) e quindi selezionando l'ispettore degli attributi (come mostrano le immagini).

Questo imposterà anche le linee di allineamento come iOS 6.

Un altro ottimo strumento in xCode 5 è "Anteprima": fai clic sul pulsante del maggiordomo (assistente all'editor) e seleziona Anteprima. lì puoi selezionare iOS 6 e vedere come apparirà il design dello storyboard su iOS 6.

È semplicemente fantastico: D

[Aggiornare]

Attenzione: la disattivazione di "Estendi bordi" potrebbe causare un bagliore nero sulla barra di navigazione quando l'app entra in background su iOS7. il bagliore sarà visibile anche nella visualizzazione multitasking (doppia pressione del tasto home). questo può essere risolto impostando il colore di sfondo della visualizzazione della barra di navigazione su bianco.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

Sì, questa è la soluzione che arriva da una prospettiva dello storyboard. Grazie.
jpittman

12

Come dice l'OP, c'è una soluzione semplice a questo che è impostare la barra di navigazione in modo che sia opaca. Invece di farlo nel codice, deseleziona semplicemente "Traslucido" per la barra di navigazione principale:

inserisci qui la descrizione dell'immagine


8

self.edgesForExtendedLayout=UIRectEdgeNone;

Funziona su simulatore iOS 7 (Xcode 5 DP5)


2
questo funziona bene in ios7 ma se ho eseguito l'app su ios 6 e prima ancora le visualizzazioni vengono spostate verso l'alto. Qualche soluzione per questo ?. Inoltre dobbiamo impostare questa proprietà in ogni metodo di caricamento viewdid del controller di visualizzazione?
loganathan

puoi sempre controllare se l'attuale iOS è 7 con questo se:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross

2

queste risposte sono state tutte utili, soprattutto MQoder, ma per me ho anche dovuto impostare la barra superiore predefinita su "navigazione nera opaca".

inserisci qui la descrizione dell'immagine


1

La risposta di @One Man Crew è corretta, ma:

Consiglio di utilizzare questo codice per evitare errori durante l'esecuzione dell'app su versioni precedenti:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

E devi farlo su AppDelegate # application: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Altrimenti il ​​colore di sfondo della barra di navigazione diventerà grigio. Perché la barra di navigazione trasparente si sovrappone alla finestra.


0

Se vuoi mantenere la trasparenza quando l'utente scorre la visualizzazione della tabella, puoi impostarne il contenutoInset:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

Una soluzione è utilizzare il controller di navigazione. Questo risolverà automaticamente il problema. Usa anche Xcode 5 al posto delle versioni di Xcode Preview poiché sono beta.

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.