2009-07-11 12 views
22

Come posso ridimensionare la vista in risposta alla barra di stato in chiamata dal mio pennino?Ridimensiona per barra di stato in chiamata?

Ho pensato che sarebbe stato solo l'impostazione delle proprietà di ridimensionamento, ma non sono abilitati per l'UIView di root.

(Penso che il mio problema principale qui è che non so che cosa viene chiamato, non riesco a trovare alcun riferimento alla barra di stato in chiamata in nessuna documentazione eccetto dove parla del simulatore . comando di menu)

risposta

6

Cosa fare intendi quando dici che "le proprietà di ridimensionamento non sono abilitate per l'UIView di root"?

La barra di stato in chiamata non ha alcuna designazione particolare e non penso che ci siano API o notifiche attorno ad esso. Invece, le tue visualizzazioni dovrebbero semplicemente essere impostate per autorizzare correttamente.

Provare a creare una nuova app basata su navigazione in Xcode e studiare le impostazioni di autorizzazione sulla vista tabella in RootViewController.xib. Spero che vedrai un delta tra ciò che è impostato da Apple e ciò che hai impostato nel tuo progetto.

+0

Probabilmente sto usando anche il termine sbagliato. Fondamentalmente, ho uno xib con un UIView. Selezionando l'UIView e osservando le proprietà di ridimensionamento, posso fare clic sulle connessioni superiore/inferiore e sinistra/destra, ma l'orizzontale e il verticale al centro non rispondono ai clic. –

+0

Creato un nuovo UIView nello xib e posso manipolarlo. Sembra che ci sia qualcosa di sbagliato in quell'IView nello xib. Sperimenteremo un po 'di più e segnalo come soluzione, se è così. –

+0

Sì, sembra che qualcosa sia semplicemente sbagliato in tale UIView. Grazie. –

16

stai cercando - [UIApplication statusBarFrame] e, nel vostro UIApplicationDelegate, si dovrebbe implementare questo metodo delegato per la notifica di quando le modifiche del telaio della barra di stato:

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame 
+1

Mike, puoi chiarire: questo significa che devo ridimensionare manualmente gli elementi sulle mie viste nel codice? Gasp! –

+1

Non vedo perché se le proprietà di autorizzazione della vista sono impostate correttamente. Ma sì, scrivendo codice - che orribile inconveniente. :-) –

+0

Contrassegnare l'altro accettato perché ha sottolineato che quello che stavo cercando di fare * dovrebbe * aver funzionato prima, ma grazie mille. :) –

3

Per visualizzazioni come UITableView in genere è necessario modificare l'altezza della cella della tabella e non c'è altro modo per farlo se non per implementare l'applicazione : didChangeStatusBarFrame:. Ma non è un problema, e tu puoi impostare l'altezza della riga su valori non interi, se necessario.

+0

Tranne quell'applicazione: didChangeStatusBarFrame: e la notifica di accompagnamento non viene mai inviata per una semplice modifica del frame di stato. Provalo :-) –

+0

L'ho notato quando sono riuscito a provarlo. Quindi, come gestiamo il cambiamento delle dimensioni dello schermo? L'interfaccia della mia app scorre verso il basso, ma viene parzialmente oscurata nel processo. –

0

La soluzione è quello di garantire che avete fatto la vostra chiave finestra:

[window makeKeyAndVisible]; 

Se non fai che la visualizzazione secondaria non viene ridimensionato automaticamente, ma non ci sono altri sintomi per quanto ne so.

1

Avevo lo stesso problema. Quello che ho fatto è stato questo.

  1. Aprire il file XI ter in IB
  2. tutti gli elementi dell'interfaccia sono per default collegato a muoversi lungo con con piano e mostrato nella proprietà 'ridimensionamento automatico' nel 'ispettore Size'. Quindi, per gli elementi dell'interfaccia utente nella parte inferiore dello schermo, rimuovi il collegamento dall'alto e invece fai il link dal basso. Lascia tutti gli altri così com'è.
  3. Problema risolto !!!

Spero di essere stato chiaro.

+0

Ora la mia vista non è visibile se faccio il collegamento in basso. –

+0

No, non funziona per me –

24

iOS invocherà il metodo viewViewer viewWillLayoutSubviews ogni volta che si verifica un cambiamento nella barra di stato. Puoi sovrascriverlo e modificare le sottoview in base ai nuovi limiti.

- (void)viewWillLayoutSubviews { 
    // Your adjustments accd to 
    // viewController.bounds 

    [super viewWillLayoutSubviews]; 
} 
+0

Bene se modifichi i limiti qui 'viewWillLayoutSubviews' sarà chiamato di nuovo in modo ricorsivo. – Rivera

+0

strano che viewController è notificato ma non viene ridimensionato, altezza srinked, qualche idea del perché? –

+0

Ottimo! Puoi aggiornare il tuo contentFrame che potresti utilizzare come costante anche in UIViewController per self.view.bounds, in modo che l'offset si propaghi attraverso la tua gerarchia di visualizzazione. –

7

Una vista non può ridimensionare automaticamente con lo status di modifiche di dimensione bar se non si dispone di un set di root View Controller. Inizialmente avevo questo nel mio delegato della mia app, e la mia app funzionava correttamente sotto tutti gli aspetti tranne che non si ridimensionava correttamente durante le telefonate.

[self.window addSubview:rootController.view]; 

Ho modificato la riga sopra e ora la mia app si ridimensiona automaticamente durante le chiamate.

[self.window setRootViewController:rootController]; 

Ho scoperto questa correzione dopo aver visto questo nel registro e indagare la causa.

Application windows are expected to have a root view controller at the end of application launch 
+0

Grazie mille! È definitivamente risolto il mio problema. – GeRyCh

+0

OMG questo! Questo ha risolto il mio problema, dopo aver passato ore a modificare le proprietà fullScreen di quasi tutto! – ArkReversed

7

questo funziona per me perfettamente quando la mia applicazione è in esecuzione in background e premere Command + T. Nel mio scenario, il controller principale è il mio controller barra delle schede e sto riaggiustare il mio controller di navigazione all'interno di ogni scheda.

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{ 
[UIView animateWithDuration:0.35 animations:^{ 
    CGRect windowFrame = ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame; 
    if (newStatusBarFrame.size.height > 20) { 
     windowFrame.origin.y = newStatusBarFrame.size.height - 20 ;// old status bar frame is 20 
    } 
    else{ 
     windowFrame.origin.y = 0.0; 
    } 
    ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame = windowFrame; 
}]; 

}

+0

Questo non dovrebbe essere necessario; Penso che ci sia un bug nei template di Xcode. L'ho risolto eliminando + ricreando il controller della vista. Il nuovo risponde come mi aspettavo. –

+0

L'ho risolto, nel mio caso avevo spinto un controller della barra delle linguette all'interno di un controller di navigazione, quindi causava i problemi. Ora funziona perfettamente. Ora il controller della barra delle schede è il mio controller principale e sto riadattando la vista del controller di navigazione all'interno del controller della barra delle linguette. – user1544494

+0

Grazie al suo lavoro per me. Grazie :) – ilesh

0

Nessuna delle soluzioni postato prima ha lavorato per me. Ciò che ha funzionato per me è stato il fatto che non avevo i miei limiti impostati correttamente per le mie opinioni. Nella mia situazione, ho avuto due diverse visualizzazioni del contenitore nella mia vista.

View of scene in storyboard.

Il fondo (nella lista) vista del contenitore è stato un UITableView, che non è stato correttamente scorre sul fondo della tabella. Il motivo era che l'offset della barra di stato della chiamata stava causando la modifica dell'origine (angolo superiore sinistro) di UITableView, ma le dimensioni rimanevano uguali. Ciò significava che la parte inferiore del tavolo era fuori dallo schermo!

La soluzione era impostare correttamente il Autoresizing vincolo di altezza. Nello screenshot qui sotto, sono le frecce verticali nel mezzo della casella Autoresizing.

enter image description here

+0

Il mio problema originale, molto tempo fa, era che queste frecce erano semplicemente non disponibili. Non ho mai capito perché, ma ricreare la vista all'interno del controller della vista l'ha risolto. –

+0

@StevenFisher buono a sapersi! Grazie! – mikeho

2

La notifica per la barra di stato telaio cambiando è

UIApplicationWillChangeStatusBarFrameNotification

Registro in qualità di osservatore:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

Poi rispondere ai cambiamenti nel vostro gestore:

- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }

Anche con l'installazione automatica in modo corretto, potrebbe essere necessario rispondere alle modifiche. Ad esempio, una vista tabella che calcola la sua altezza della cella in base allo spazio specificato nella schermata potrebbe richiedere reloadData dopo la modifica della barra di stato.

Documentation

1

Si dovrà aggiornare la vista manualmente se si sta impostando le cornici vista programatically

-(void) viewDidAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; 

} 

- (void)statusBarFrameWillChange:(NSNotification*)notification 
{ 
// respond to changes 
NSLog(@"STATUS BAR UPDATED"); 
NSDictionary *statusBarDetail = [notification userInfo]; 
NSValue *animationCurve = statusBarDetail[UIApplicationStatusBarFrameUserInfoKey]; 
CGRect statusBarFrameBeginRect = [animationCurve CGRectValue]; 
int statusBarHeight = (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication]statusBarOrientation])) ? statusBarFrameBeginRect.size.height : statusBarFrameBeginRect.size.width; 

NSLog(@"status bar height %d", statusBarHeight); 
} 

-(void) viewDidDisappear:(BOOL)animated 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationBackgroundRefreshStatusDidChangeNotification object:nil]; 
} 

Questo vi dà la nuova altezza della barra di stato e di utilizzare questo è possibile aggiornare le cornici di conseguenza.

Problemi correlati