Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in 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 il mio punto di vista il limite è che non sempre ridimensionata per conto per la barra di stato e barra di navigazione.

In viewDidLayoutSubviews, mi stampa la vista limiti:

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

Questo risultato a mio contenuto che appare sotto la barra di navigazione e la barra di stato.

So che potrebbe spiegare l’altezza a me stesso di raggiungere la schermata principale dell’altezza, sottraendo la barra di stato dell’altezza e della barra di navigazione altezza, ma che sembra superfluo lavoro.

Come posso risolvere questo problema?

Aggiornamento:

Ho trovato una soluzione per questo problema specifico. Impostare la barra di navigazione traslucido proprietà:

self.navigationController.navigationBar.translucent = NO;

Questo consentirà di correggere la vista non viene inquadrato sotto la barra di navigazione e la barra di stato.

Tuttavia, non ho trovato un fix per il caso in cui si desidera che la barra di navigazione per essere traslucido. Per esempio, la visualizzazione di una foto a schermo intero, vorrei avere la barra di navigazione traslucido, e la vista di essere inquadrato sotto di esso. Che funziona, ma quando ho mostrare/nascondere la barra di navigazione, ho sperimentato anche straniero risultati. Il primo sottoview (una UIScrollView) ottiene i suoi limiti origine y cambiato ogni volta.

  • Sono anche sempre lo stesso problema in xcode 5 DP
  • Fatemi sapere se vi saranno mostrati anche qualche soluzione
  • Grande..funziona anche per me..
  • Mi può dire perché la barra di navigazione pulsante indietro mostrando sempre con il testo in blu???
  • Guardate nella barra di navigazione per una tinta di colore proprietà, si dovrebbe essere in grado di cambiare colore blu a tutto ciò che si desidera.
  • Io odio l’aggiornamento di ios, a volte, perché Apple non ha mai dato una opportunità di mantenere le app compatibili.
  • Grazie un sacco per questo. Funziona perfettamente!
  • mettere il vostro aggiornamento di una risposta, e di accettare che, come la risposta ad aiutare gli altri
  • Se il problema è legato alla visualizzazione di andare sotto la barra di stato, dopo aver nascosto il controller di navigazione barra in alto mi riferisco alla risposta da @Stunner stackoverflow.com/a/18976660/235206 come la soluzione
  • Grazie per questo, vorrei avrebbe trovato 8 ore fa… FWIW, una Nuova installazione della mia App non ha questo problema, ma di aggiornare la mia app.. strano ios7 $#!+
  • Mi chiedo perché…
  • non quando si presenta modalviewcontrollers

InformationsquelleAutor beebcon | 2013-06-12

 

20 Replies
  1. 495

    Si può raggiungere questo obiettivo attraverso l’attuazione di una nuova struttura denominata edgesForExtendedLayout in iOS7 SDK. Si prega di aggiungere il codice riportato di seguito per ottenere questo,

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

    È necessario aggiungere sopra nel vostro -(void)viewDidLoad metodo.

    iOS 7 introduce diversi cambiamenti come il layout e personalizzare il
    aspetto di UI. I cambiamenti nella visualizzazione layout di controllo, tinta
    colore e tipo di carattere interessano tutti i UIKit oggetti nella vostra app. In
    inoltre, i miglioramenti al gesto di riconoscimento Api offrono un maggiore
    un controllo molto più di un gesto farmacologiche.

    Con View Controller

    In iOS 7, vista controller di utilizzare layout a schermo intero. Allo stesso tempo,
    iOS 7 offre un maggiore controllo sul modo in cui un view controller
    espone le sue opinioni. In particolare, il concetto di layout a schermo intero
    è stato raffinato per lasciare un view controller specificare il layout di ogni
    bordo di vista.

    Il wantsFullScreenLayout view controller proprietà è deprecato in
    iOS 7. Se attualmente specificare wantsFullScreenLayout = NO, la vista
    controller può visualizzare il suo contenuto in un’inaspettata posizione sullo schermo
    quando è in esecuzione in iOS 7.

    Per regolare come un view controller espone le sue opinioni, UIViewController
    fornisce le seguenti proprietà:

    • edgesForExtendedLayout

    Il edgesForExtendedLayout proprietà utilizza il UIRectEdge tipo,
    che specifica di ciascun rettangolo e quattro i bordi, oltre a
    la specifica di nessuno e di tutti. Utilizzare edgesForExtendedLayout a specificare che
    bordi di vista dovrebbe essere esteso, a prescindere dal bar traslucenza. Da
    di default, il valore di questa proprietà è UIRectEdgeAll.

    • extendedLayoutIncludesOpaqueBars

    Se il progetto utilizza opaco bar, affinare edgesForExtendedLayout da
    anche l’impostazione del extendedLayoutIncludesOpaqueBars proprietà
    NON. (Il valore di default di extendedLayoutIncludesOpaqueBars è NON.)

    • automaticallyAdjustsScrollViewInsets

    Se non si desidera visualizzare i contenuti di inserti per essere automaticamente
    regolato, set automaticallyAdjustsScrollViewInsets per NON. (Il
    il valore predefinito automaticallyAdjustsScrollViewInsets è .)

    • topLayoutGuide, bottomLayoutGuide

    Il topLayoutGuide e bottomLayoutGuide proprietà indicano il
    posizione in alto o in basso i bordi delle barre in vista del controller di vista.
    Se le barre dovrebbero ricoprire la parte superiore o inferiore di una vista, è possibile utilizzare
    Interface Builder per posizionare la vista relativa al bar con la creazione di
    vincoli per il fondo di topLayoutGuide o per
    bottomLayoutGuide. (Se no barre deve sovrapporsi a vista, fondo
    topLayoutGuide è lo stesso come il top della vista e la parte superiore del
    bottomLayoutGuide è lo stesso come il fondo della vista.) Entrambi
    proprietà sono pigramente creato quando richiesto.

    Si prega di fare riferimento, apple doc

    • Non compilare su iOS6. Penso che dovrebbe essere scritto come performselector…
    • Sì, è per questo che ho inserito il selettore di controllo con if, if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    • Ho provato… Ma con questo metodo cambia tutte le mie barre, dal bianco al grigio… c’È una soluzione?
    • impostare il colore di una finestra per la visualizzazione del colore di sfondo, cioè: [self.finestra setBackgroundColor:[UIColor whiteColor]];
    • Questo non avrebbe funzionato se non ho la barra di navigazione. In quel caso, il mio punto di vista si estende dietro la barra di stato..
    • Ho lo stesso problema di @VanDuTran. edgesForExtendedLayout non se la barra di navigazione è nascosto.
    • Inoltre, questo testo è copiato dalla documentazione di Apple, che è molto chiaro. Qualcuno può spiegare in modo comprensibile le parole che tutte queste opzioni?
    • Se il problema è legato alla visualizzazione di andare sotto la barra di stato, dopo aver nascosto il controller di navigazione barra in alto mi riferisco alla risposta da @Stunner stackoverflow.com/a/18976660/235206 la soluzione
    • Ho fatto tutto quanto suggerito: nessun cambiamento. La barra di stato è visualizzata sempre traslucido e anche comparsa viste show dopo la barra di stato
    • Ho avuto un problema cercando di utilizzare questa soluzione. È stato risolto facendo in modo che ero in un Xcode 5.0 storyboard e si era Vista come insieme di iOS 7.0 e versioni successive nel file di ispezione per la storyboard. Se è stata impostata una precedente versione di Xcode, non si ottiene il nuovo layout e la funzionalità.
    • funziona ma … non c’è più l’effetto traslucido… come possiamo preservare effetto traslucido e…
    • l’aggiunta di questo pezzo di codice in -(void)viewDidLayoutSubviews{ ha fatto il trucco per me
    • non funziona quando si presenta modal view controller
    • Grande risposta!!! Btw, il codice swift è if(self.respondsToSelector(Selector("edgesForExtendedLayout"))) { self.edgesForExtendedLayout = UIRectEdge.None }
    • per quanto riguarda in iOS 8?

  2. 110

    Non devi calcolare quanto a spostare tutto giù, c’è una generazione in proprietà per questo. In Interface Builder, evidenzia il view controller, quindi selezionare gli attributi di ispezione. Qui potrete vedere alcune caselle di controllo accanto alle parole “estensione dei Bordi”. Come si può vedere, nella prima immagine, la selezione predefinita è per il contenuto compaia sotto la cima e il fondo di bar, ma non sotto opaco bar, che è il motivo per cui l’impostazione della barra di stile per non traslucido lavorato per voi.

    Come si può in qualche modo vedere nella prima immagine, ci sono due elementi dell’interfaccia utente di nascondere sotto la barra di navigazione. (Ho attivato la wireframe in IB per illustrare questo) Questi elementi, un UIButton e un UISegmentedControl entrambi hanno i loro “y” origine impostato a zero, e il controller di visualizzazione è impostata su consenti contenuto sotto la barra superiore.

    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    Questa seconda immagine mostra cosa succede quando si deseleziona “Sotto il piano Bar” casella di controllo. Come si può vedere, il view controller di vista è stato spostato verso il basso in modo appropriato per la sua origine y di essere di destra sotto la barra di navigazione.

    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    Questo può anche essere realizzato a livello di programmazione tramite l’utilizzo di -[UIViewController edgesForExtendedLayout]. Ecco un link per la classe di riferimento per edgeForExtendedLayout, e per UIRectEdge

    [self setEdgesForExtendedLayout:UIRectEdgeNone];
    • Come faccio a fare lo stesso solo per vista .xib?
    • Ho aggiunto un’etichetta su vista e ho seguito le tue istruzioni ma questo non è lavoro per me
    • La risposta alla XIB domanda è, “non È possibile.” Non attraverso IB comunque. File di un radar e di speranza Apple, infine, gli indirizzi di esso.
    • Grazie @0x7fffffff, Questo era solo l’info che cercavo e che è stato molto utile.
  3. 33

    Ho creato il mio punto di vista a livello di programmazione e questo ha funzionato per me:

    - (void) viewDidLayoutSubviews {
        //only works for iOS 7+
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
    
            //snaps the view under the status bar (iOS 6 style)
            viewBounds.origin.y = topBarOffset * -1;
    
            //shrink the bounds of your view to compensate for the offset
            viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
            self.view.bounds = viewBounds;
        }
    }

    Fonte (in topLayoutGuide sezione in fondo alla pagina.39).

    • Finalmente trovato una risposta che in realtà lavora per questo. Buon lavoro!
    • Per risolvere il problema per il quale il controller di visualizzazione di una vista che si presenta sotto la barra di stato quando la barra di navigazione è nascosto, questo è il codice che scatta la vista sotto la barra di stato.
    • Nota: in questo modo verranno spingere la parte inferiore del vostro punto di vista al di fuori dello schermo.
    • Inoltre, a meno che non si sta costruendo per solo iOS7, il codice di cui sopra, verrà generato un errore – topLayoutGuide è iOS7 solo.
    • Grazie, appena mi salva per 2 ore di normale codice GUI incubo!!! Questo lavoro, come per magia
    • Mettere questo come condizione , in modo da non mandare in crash su iOS 6.0 se ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    • Ho un problema con questo codice, l’ho vista tabella all’interno della vista e dopo l’applicazione di questo codice tabella di vista va oltre il limite.
    • Come detto da AnswerBot, questo codice spingere la parte inferiore del vostro punto di vista offscreen. È necessario per compensare che, modificando l’altezza della tabella di visualizzazione.
    • Nota anche che quando la tua vista principale è una UITableView il viewDidLayoutSubviews verrà chiamato in ogni scorrimento. Il UITableView verrà scalato fino a che la sua altezza è di 15px. Aggiungere un flag solo l’esecuzione di questo codice una sola volta. 😉
    • perché non cambiare il telaio invece di confini ?
    • È possibile modificare il telaio così e funziona. Il motivo per cui ho cambiato il limite è perché ho finito per usare il frammento di codice Apple, e che ha già utilizzato limiti, così ho lavorato con che. Vedi il link che ho fornito.
    • Grata!!! funziona bene in entrambi i iOS6 & iOS 7, ma ho visto i miei UIToolBar camiceria basso verso l’alto con un po ‘ di colore in iOS 7 per 2 secondi. qualche suggerimento?? Grazie

  4. 28

    Swift 3 /Swift 4 soluzione che funziona anche con Pennini/XIB file in iOS 10+:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        edgesForExtendedLayout = []
    }
    • Questo è Quello che mi ha Aiutato… è Così Semplice. Grazie 🙂
    • Grazie, è davvero utile
    • Questa è la soluzione migliore per il 10.x Swift 3+ IMO
    • Funziona, però non so perché.
  5. 10

    Se si desidera visualizzare per avere la traslucido della barra di navigazione (che è una specie di bello) è necessario l’installazione di un contentInset o simili.

    Ecco come fare:

    //Check if we are running on ios7
    if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
          CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
          float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;
    
          myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
    }
    • che cosa è la necessità di dividere 7.0 in 7 e 0 ??? @Magnus
    • perché non si può confrontare direttamente con la 7.0
    • lol ho capito: verifica nei confronti di una particolare versione con minore aggiunto è meno robusto. Ma controllare se il valore è MAGGIORE o uguale a modo confrontando 7.0 avrebbe fatto bene qui 😉
    • Questa è la funzionalità in 7.x e versioni successive – così posso controllare se la versione 7 o superiore e saltare le modifiche minori nel controllo.
    • Ho Avuto un problema con il mio tableView essere visualizzato dietro il mio Tabbar. Che ha fatto l’ultima riga della tabella mai a scorrere sopra la Tabbar. Ho risolto così: myTableView.contentInset = UIEdgeInsetsMake(0, 0.0, TabbarHeight, 0)
    • contentInset è una proprietà di UIScrollView. Cosa succede se il mio principale punto di vista non è una sottoclasse di UIScrollView. Quindi come faccio a risolvere il problema di sovrapposizione?
    • BOOL ios7 = [[UIDevice currentDevice] systemMajorVersion] == 7;
    • Questa è la soluzione migliore per il mio scopo. Per rendere meglio, collectionView.scrollIndicatorInsets dovrebbe essere troppo. E traslucido, è privo di significato nella maggior parte dei casi se la vista non è una scrollView.

  6. 9

    edgesForExtendedLayout fa il trucco per iOS 7. Tuttavia, se si crea l’app su iOS 7 SDK e implementare in iOS 6, la barra di navigazione appare traslucido e il punto di vista andare sotto di esso. Così, per risolvere il problema sia per iOS 7 e iOS 6 fare questo:

    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;   //iOS 7 specific
  7. 9

    Nelle app file plist aggiungere una riga chiamata “View controller basato su barra di stato apparenza” e impostare NON.

  8. 7

    Il semplice trucco è quello di aprire il PENNINO file e fare queste due semplici passaggi:

    1. Solo toggle che e impostare quello che si preferisce:

    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    1. Selezionare quelli UIView s/UIIMageView s/… che si desidera essere spostato verso il basso. Nel mio caso solo il logo è stato sovrapposto un ho impostato il delta di +15 (O -15 se si è scelto di iOS 7 nel passaggio 1)

    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    E il risultato:

    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7
    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    • Funziona, ma questo l’aspetto di un rigido per mantenere la soluzione. Sarebbe meglio risolvere il problema invece di patch.
    • sarebbe meglio farlo a livello di programmazione per tutti vista la sottoview perché non funziona se applicato a vista principale
  9. 5

    Swift Soluzione:

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.edgesForExtendedLayout = UIRectEdge.None
    }
    • Questo è ora edgesForExtendedLayout = []
    • Dal momento che questa è una risposta pubblica, non dovremmo dimenticare di chiamare: super.viewWillAppear(animated)
  10. 4

    Vorrei espandere sulla Stunner risposta, e aggiungere un if istruzione per verificare se si tratta di iOS 7, perché quando l’ho testato su iOS 6 la mia app va in crash.

    L’aggiunta sarebbe l’aggiunta di:

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

    Quindi vorrei suggerire l’aggiunta di questo metodo a MyViewControler.m file:

    - (void) viewDidLayoutSubviews {
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
            viewBounds.origin.y = topBarOffset * -1;
            self.view.bounds = viewBounds;
        }
    }
  11. 3

    Ho uno scenario in cui io uso il BannerViewController scritto da Apple per visualizzare i miei annunci e ScrollViewController incorporato nel BannerViewController.

    Per evitare che la barra di navigazione nascondere i miei contenuti, ho dovuto fare due cambi.

    1) Modificare BannerViewController.m

    - (void)viewDidLoad
    {
       [super viewDidLoad];
       float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
       if (systemVersion >= 7.0) {
          self.edgesForExtendedLayout = UIRectEdgeNone;
       }
    }

    2) Modificare il mio ScrollViewContoller

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
        if (systemVersion >= 7.0) {
            self.edgesForExtendedLayout = UIRectEdgeBottom;
        }
    }

    Ora gli annunci visualizzati correttamente in fondo la vista, invece di essere coperto dalla barra di Navigazione e il contenuto in alto non è tagliato fuori.

  12. 2

    basta impostare il codice riportato di seguito in vista appare.

      if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
     }
    • Questa è l’unica cosa che ha funzionato nel mio caso.
  13. 1

    Per me, la soluzione più semplice è quello di aggiungere due tasti in plist

    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    • +1, ho avuto la “barra di Stato inizialmente nascosto”=SÌ, ma quando si aggiunge “View controller basato su barra di stato l’aspetto”=NO, mi sono liberato della barra di stato.
  14. 1

    Aggiungere il tasto “View Controller basato su barra di stato l’aspetto” dall’elenco a discesa come una riga info.plist. Qualcosa di simile a questo:

    Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    • Non aiuta…
    • interessante.ha aiutato sul mio cocos2d progetti.come attivare o disattivare questa opzione posso vedere la barra di stato superiore è completamente andato o apparire.
  15. 1

    Ho avuto lo stesso problema con la mia app da ipad (armv7, armv7s, amr64) solo presentando un altro UIViewController e dopo il licenziamento va barra di navigazione sotto la barra di stato…
    Ho passato un sacco di tempo per trovare una soluzione per questo. Sto usando storyboard e InterfaceBuilder per UIViewController che rende terribile ho impostato la Presentazione a schermo intero -> Attuale Contesto e risolvere questo problema. Funziona nel mio app solo per ipad => iOS8.0 (test con iOS8.1) e ipad con iOS 7.1 non funziona!! Barra di stato e barra di navigazione vengono visualizzati sopra la mia vista limiti in iOS 7

    • Nel mio caso, la mia vista era sovrapposti mio tabBar e non ho Idea del perché. Si scopre l’estensione dei Bordi > In Barre di Fondo è stato controllato. E ‘ stato davvero difficile da notare perché lo sfondo del mio app era bianco e non solo generato un certo livello di opacità sulla mia tabBar. Grazie!
  16. 1

    Swift 4.2 – Xcode 10.0 – iOS 12.0:

    if #available(iOS 11.0, *) {} else {
      self.edgesForExtendedLayout = []
      self.navigationController?.view.backgroundColor = .white
    }
  17. 0

    Passi Per Nascondere la barra di stato di iOS 7:

    1.Vai all’applicazione info.file plist.

    2.E Impostare, Visualizzare controller basato su barra di stato aspetto : Boolean NO

    Spero di risolvere la barra di stato problema…..

  18. 0

    Nel mio caso avendo loadView() interrotto

    questo codice:
    auto.edgesForExtendedLayout = UIRectEdgeNone

    ma dopo l’eliminazione di loadView() tutto ha funzionato bene

Lascia un commento