2013-09-24 12 views
20

Ho un progetto che è stato creato l'anno scorso e utilizza XIBs, senza storyboard. Gli XIB non usano il layout automatico, ma usano un autosizing. Ho un problema durante l'esecuzione con iOS7, in cui tutte le viste sono nascoste sotto la barra di stato. Capisco perfettamente che questa è una nuova funzionalità di iOS7, nella quale è prevedibile. Tuttavia, tutte le soluzioni per risolverlo per non farlo non funzionano. Ho un'immagine nella parte superiore della vista che mostra sempre sotto la barra di stato, e non sto usando le barre di navigazione o qualcosa del genere.iOS7 - Visualizza sotto barra di stato - edgesForExtendedLayout not working

Ho provato ad aggiornare le Y-delta nel XIB (non hanno alcun effetto sulla vista), ho provato a fissare il edgesForExtendedLayout a UIRectEdgeNone (non fa nulla), e una moltitudine di altre cose. Ogni volta, la barra di stato mostra con la vista nascosta sotto di essa, non importa quello che faccio .. cioè a meno che non sposto manualmente la vista in XIB per lasciare spazio alla barra di stato (ma quella soluzione non funziona perché non sembra corretto in iOS6, ovviamente).

Cosa c'è di strano è che, anche quando cerco una riga di codice per incidere in una vista-shift, non funziona (come il seguente):

self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+20, self.view.frame.size.width, self.view.frame.size.height); 

..non che sarebbe andato con quel tipo di soluzione, ma è solo strano che non ha funzionato (l'unica volta che vedo che non funziona è se il layout automatico è a posto, che non è in questo caso).

È un requisito di progettazione che mostra la barra di stato e sono solo perplesso sul motivo per cui non riesco a impostare la vista sotto la barra di stato per iOS7. Ho letto ogni singolo post di Stack Overflow sull'argomento, nonché le transizioni/guide di Apple. Ancora una volta, per ribadire, comprendo pienamente come dovrebbe funzionare e quale dovrebbe essere la soluzione prevista a questo, ma nessuno di questi sembra funzionare per questo particolare progetto.

Sono uno sviluppatore iOS esperto, ma questo progetto è stato creato da un altro team, quindi non so se c'è qualcosa nascosto nei file XIB, plist o codice che potrebbero saltare le impostazioni precedenti. Per favore fatemi sapere se c'è qualcos'altro che può essere visto su questo, o più informazioni che posso fornire.

Grazie in anticipo!

+0

hey hanno u ottenere qualsiasi soluzione? sto affrontando lo stesso problema. – Kalpesh

+0

Chiunque abbia una soluzione proprio lì? –

risposta

17

Se si impostano i valori delta iOS 6/7 in Interface Builder, ricordarsi di impostare "Visualizza come" a "iOS 6" sul Builder Document Interface, dal momento che è il layout iOS 6 si desidera replicare . I delta saranno quindi utilizzati solo su iOS 7 per spingere il contenuto sotto la barra di stato. Se lasci "Visualizza come" impostato su iOS 7 (impostazione predefinita) i delta ti daranno invece l'aspetto di iOS 7 su iOS 6.

Tuttavia, i delta non ti aiuteranno se si riposizionano o ridimensionano le viste a livello di codice in base a la cornice della vista, dal momento che la cornice non tiene conto dei delta.

Invece di utilizzare i delta, la soluzione migliore che ho trovato è di abilitare il layout automatico sul tuo XIB principale e quindi impostare il vincolo di spazio superiore nella vista superiore/contenuto per seguire la Guida al layout principale. Questa guida è stata introdotta in iOS 7 e rappresenta la posizione sotto la barra di stato. Sfortunatamente la guida non è disponibile in Interface Builder quando non si utilizza Storyboard, ma è possibile aggiungerlo a livello di programmazione.

Ciò che ho fatto è stato aggiungere un superstimeno al superview invece che in Interface Builder e creato uno sbocco per questo nel codice.Quindi, in viewDidLoad, se la topLayoutGuide è disponibile (iOS 7+), sostituire il vincolo in questa presa con una versione utilizzando invece la Guida al layout principale.

if ([self respondsToSelector:@selector(topLayoutGuide)]) { 
    [self.view removeConstraint:self.containerTopSpaceConstraint]; 

    self.containerTopSpaceConstraint = 
    [NSLayoutConstraint constraintWithItem:self.contentView 
           attribute:NSLayoutAttributeTop 
           relatedBy:NSLayoutRelationEqual 
            toItem:self.topLayoutGuide 
           attribute:NSLayoutAttributeBottom 
           multiplier:1 
            constant:0]; 

    [self.view addConstraint:self.containerTopSpaceConstraint]; 

    [self.view setNeedsUpdateConstraints]; 
    [self.view layoutIfNeeded]; 
} 
+0

Ciò ha avuto l'effetto di spostare la barra nella parte superiore dello schermo verso il basso, che è buona, ma ha anche fatto in modo che la mia barra di stato avesse uno sfondo bianco invece di uno sfondo grigio. – ArtOfWarfare

+0

Su iOS 7 lo sfondo della barra di stato è trasparente. Imposta il colore di sfondo per la tua vista superiore (dietro la barra di stato) a qualsiasi colore desideri che la barra di stato abbia. –

+0

Ho trovato reset self.view.frame. GRAZIE! – frank

6

Per riferimento, la soluzione seguente funzionava quando l'ho applicata al ViewControllers. Tuttavia, non è l'ideale e un po 'hacky. Se è l'unico approccio che posso prendere, allora così sia, però.

float systemVersion=[[[UIDevice currentDevice] systemVersion] floatValue]; 
if(systemVersion>=7.0f) 
{ 
    CGRect tempRect; 
    for(UIView *sub in [[self view] subviews]) 
    { 
     tempRect = [sub frame]; 
     tempRect.origin.y += 20.0f; //Height of status bar 
     [sub setFrame:tempRect]; 
    } 
} 
+0

hey Ho usato il codice sopra, ma questa vista è sotto la barra di navigazione e voglio che venga sopra la barra di navigazione.Si prega di aiutare se avete qualche altra soluzione. –

5

Apple sta spingendo a utilizzare l'autolayout per realizzare questo. È necessario impostare un vincolo sulla "Guida al layout top" dalla sottoview in alto nella visualizzazione.

Vedere questo documento per gli esempi:

https://developer.apple.com/library/ios/qa/qa1797/_index.html

di fare questo senza XIBs, è necessario aggiungere il vincolo programatically. I documenti di Apple danno un buon esempio di ciò, che ho riassunto di seguito.

Assegnare che lo topLayoutGuide è una proprietà su un controller di visualizzazione, è sufficiente utilizzarlo nel dizionario delle associazioni di variabili. Poi si imposta il vincolo come normale:

id topGuide = [myViewController topLayoutGuide]; 
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(button, topGuide); 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-20-[button]" options:0 metrics:nil views:viewsDictionary]; 

La documentazione per questa può essere trovato in the UIViewController class reference.

+1

Non è possibile impostare un vincolo nella Guida al layout principale da Interface Builder se si utilizza un XIB, solo se si utilizza uno storyboard. Quindi la domanda rimane, come si crea questo vincolo a livello di codice? –

+0

@PhillApley Vedere la mia risposta modificata per come farlo a livello di programmazione. – petehare

+0

Non riesco a vedere come si usa il vincolo con UITableView .. – shul

3

1) La soluzione più semplice se non ti dispiace avere un barra di navigazione opaca: risposta

self.navigationController.navigationBar.translucent = NO; 

2) di svguerin3 non può funzionare nel caso generale. Ad esempio, se una delle tue sottoview utilizza l'autosizing per essere agganciata nella parte inferiore del suo contenitore, la sua nuova posizione sarà errata. E potrebbe andare fuori dallo schermo nel peggiore dei casi.

+0

Provato, non ha funzionato. Questo è probabilmente il problema più odioso che abbia mai avuto. – ArtOfWarfare

2
- (void)viewDidAppear:(BOOL)animated { 
     [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)]; 
// OR 
     self.view.transform = CGAffineTransformMakeTranslation(0, 20); 
} 
0

Hai provato la visualizzazione XIBs come sorgente e la rimozione di ogni linea che contiene edgesforextendedlayout ??

abbiamo dovuto togliere questa linea nelle scene del nostro storyboard in quanto principali osservazioni quinte del nostro storyboard sono rappresentati da XIBs

quello che stava accadendo per noi era che in qualche modo, in alcune scene, i contenuti del XIB per la vista principale della scena veniva spinto verso il basso dall'altezza della barra di stato e dalla barra di navigazione.

La rimozione di questa riga ha consentito la visualizzazione degli XIB come se la loro cima fosse originata dalla stessa parte superiore della scena dello storyboard.

Purtroppo, non abbiamo idea di che cosa ha innescato questo, ma ho visto accadere quando si cambia l'ordine dei contenuti all'interno vista principale del XIB in modo che un'UITextView apparso prima. Riorganizzare l'ordine degli articoli dopo che questo è stato attivato non ha avuto alcun effetto nel rimuovere questo comportamento indesiderato.

Spero che questo aiuti qualcun altro a risolvere questo tipo di problema.

0

Se si utilizza lo storyboard, dopo aver impostato il layout superiore della vostra vista, è possibile deselezionare la casella "Sotto Bars opaco" negli attributi ispettore

Storyboard