Domanda

Nella mia app, ho ottenuto un UINavigationController. Purtroppo, quando ho ruotare il dispositivo e le variazioni di orientamento interfaccia, l'UINavigationBar non cambia la sua altezza. In altre applicazioni per iPhone, come ad esempio il Contacts.app, la barra di navigazione diventa un po 'meno alto in modalità orizzontale. Deve essere incorporato, perché se si prende l'applicazione di esempio di navigazione nel menu XCode e aggiungere l'orientamento interfaccia ad esso, lo fa cambiare l'altezza della barra di navigazione in modo corretto.

Come posso fare la barra di navigazione di ridimensionamento come avviene in tutte le altre applicazioni per iPhone che ho visto?

È stato utile?

Soluzione

Ho fatto un po 'di test, e anche se non mi piace il metodo, è abbastanza facile da fare.

Dopo aver cercato un metodo privato che potrebbe aver lavorato, non riuscivo a trovare uno. Tutto quello che ho trovato è stato:

@property BOOL forceFullHeightInLandscape;

- (BOOL)isMinibar;

Non c'è setter per -isMinibar, quindi non possiamo impostare tale. Credo che restituisce un valore in base alla sua altezza. Inoltre, è stato fissato a forceFullHeightInLandscape NO, ma ancora non ha regolare la sua altezza.

Mentre cambiare la autoresizingMask per includere UIViewAutoresizingFlexibleHeight, la vista ha ridimensionare ad essere più piccoli, ma ormai era troppo piccola. Tuttavia, -isMinibar improvvisamente restituito YES. In modo che mi ha fatto pensare solo lasciando il ridimensionamento vista stessa, adeguandolo alla giusta altezza.

Così ci andiamo, un metodo che funziona, anche senza le chiamate alle API privato:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}

Una cosa che dovrete affrontare è che i punti di vista sotto la barra non avranno regolato la barra più piccola, in modo che non ci sarà un divario tra il bar e il punto di vista qui sotto. modo più semplice per risolvere questo problema è di aggiungere una vista del contenitore, proprio come nel caso di una UINavigationController. Che saresti venuto con qualcosa di simile:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self performSelector:@selector(resizeViewsForNavigationBar) withObject:nil afterDelay:(0.5f * duration)];
}

- (void)resizeViewsForNavigationBar {
    [self.navigationBar sizeToFit];

    // Resize containerView accordingly.
    CGRect containerViewRect = self.containerView.frame;
    containerViewRect.origin.y = CGRectGetMaxY(self.navigationBar.frame);
    containerViewRect.size.height = CGRectGetMaxY(self.view.frame) - containerViewRect.origin.y;
    self.containerView.frame = containerViewRect;
}

Altri suggerimenti

Credo che il comportamento desideri solo accade quando si aggiunge un controller di navigazione (che rappresenta le barre (navigazione o della barra degli strumenti)), alla finestra nel delegato app o presentato da una barra delle schede, ecc.

È possibile aggiungere una barra di navigazione tramite IB o il codice, esso non significa che dispone di un controller di navigazione. La mia opinione è, creare un controller di navigazione e inizializzare con il controller della vista si sta lavorando. Probabilmente quando la rotazione vista, la barra di navigazione si ridurrà un po ', il modo in cui ti piace.

Spero che questo aiuti

Grazie a Joost Ho aggiunto

@property BOOL forceFullHeightInLandscape;

per la mia classe UINavigationBar personalizzato. E ambientato in:

-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;

Ha lavorato come un fascino

Simile alla risposta di Joost, ma mettendo il metodo in willAnimateRotationToInterfaceOrientation ha un effetto di animazione meglio di willRotateToInterfaceOrientation. (Non c'è nessun ritardo animazione)

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar sizeToFit];
}

Ho appena avuto questo errore così, e anche se non è probabilmente per lo stesso motivo mi piacerebbe postare qui per aiutare chiunque altro che goofs.

Se stai sovrascrivendo i metodi willRotateToInterface, ricordarsi di chiamare super

I tranciati su questo, ma una volta che ho visto la risposta accettata è venuto a me.

Credo che questo è una specie di simile a te e hanno il frammento di codice:

iPhone: UINavigationBar con bottoni - regolare l'altezza

Ho appena provato un paio di cose solo all'interno di Interface Builder e Xcode e fino a quando si utilizza il UINavigationBarController come RootViewController funziona come descritto - sempre più piccolo. Hai cambiato qualsiasi cose all'interno del controller stesso o in alcune parti del modo in cui il controller viene caricato? Soprattutto per quanto riguarda il lancio di eventi? Ho avuto alcune expiriences male con il UITabBarController in termini di rompere la corretta messaggistica e ottenuto alcuni 'interessting' effetti collaterali di vista. Basta una prova e una supposizione.

(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top