2011-03-07 22 views
15

Dalle Human Interface Guidelines iOS, iOS UI Element Usage GuidelinesUIToolbar altezza sulla rotazione del dispositivo

Su iPhone, prendere in considerazione la cambio automatico altezza barra degli strumenti che si verifica sulla rotazione del dispositivo. Nello specifico , assicurati che le icone personalizzate della barra degli strumenti si adattino bene alla più sottile barra visualizzata con orientamento orizzontale . Non specificare l'altezza di una barra degli strumenti a livello di programmazione.

posso vedere l'altezza passa da 44 punti a 32 punti in posta, Twitter per iPhone e Dropbox per esempio, ma quando aggiungo una barra degli strumenti (con Interface Builder) e hanno la mia UIViewController sottoclasse per ruotare automaticamente (shouldAutorotateToInterfaceOrientation: restituisce SÌ), la barra degli strumenti non modifica automaticamente la sua altezza sulla rotazione del dispositivo.

Il UIToolbar Class Reference non menziona questo cambio automatico di altezza, in modo dovrei cambiare a livello di codice, anche se la HIG dice Non specificare l'altezza di una barra degli strumenti di programmazione?

risposta

15

Come notato da Yonel e George nei commenti da 7KV7 risposta, cambiando la maschera il ridimensionamento automatico non funziona come previsto su iOS 5.

ho trovato un'altra soluzione utilizzando il metodo -[UIView sizeThatFits:]. Ecco come ho fatto:

- (void) layoutForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Adjust the toolbar height depending on the screen orientation 
    CGSize toolbarSize = [self.toolbar sizeThatFits:self.view.bounds.size]; 
    self.toolbar.frame = (CGRect){CGPointMake(0.f, CGRectGetHeight(self.view.bounds) - toolbarSize.height), toolbarSize}; 
    self.webView.frame = (CGRect){CGPointZero, CGSizeMake(CGRectGetWidth(self.view.bounds), CGRectGetMinY(self.toolbar.frame))}; 
} 

Poi chiamo questo metodo layoutForInterfaceOrientation: a mio avviso regolatore viewWillAppear: e willAnimateRotationToInterfaceOrientation:duration: metodi.

L'altezza è comunque cambiata a livello di codice, ma almeno il valore non è codificato.

19

Hai controllato la proprietà di ridimensionamento automatico della barra degli strumenti?

+11

Questo è tutto, quello che dovete fare 'toolbar.autoresizingMask = toolbar.autoresizingMask | UIViewAutoresizingFlexibleHeight; 'Programmaticamente come Interface Builder non ti consente di modificare l'altezza flessibile! – 0xced

+0

Pls accetta la risposta se ti ha aiutato. Felice codifica :) – visakh7

+2

non hai un effetto collaterale con iOS5.0 con questa soluzione? Funziona bene, ma le icone nella barra degli strumenti hanno sempre la dimensione orizzontale (= più piccola), anche in verticale:/ – yonel

2

Se si utilizza un ViewController in un NavigationController, è possibile utilizzare la barra degli strumenti di NavigationController invece di crearne uno personalizzato e lasciare che gestisca il ridimensionamento. Questo è ciò che la proprietà toolbarItems di ViewController è, in realtà.

+1

Sono a conoscenza di questa soluzione, ma quando premi il controller di visualizzazione B sul controller di visualizzazione A, se A non vuole una barra degli strumenti e B vuole una barra degli strumenti, non puoi ottenere una bella animazione * push * orizzontale. L'animazione della barra degli strumenti è verticale mentre l'animazione di transizione push è orizzontale, quindi a mio parere sembra imbarazzante. Non animare la barra degli strumenti è anche peggio. – 0xced

12

Questo comportamento è molto più semplice da ottenere con il layout automatico. Ho provato solo in iOS 8, ma il seguente codice funziona per me con l'animazione desiderata sul cambiamento dell'orientamento:

public override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    toolbar.invalidateIntrinsicContentSize() 
} 
+0

Funziona alla grande su iOS 9. –

+0

Questo ha funzionato quasi, ho dovuto aggiungere toolbar.sizeToFit() dopo invalidateIntrinsicContentSize(); – C0C0AL0C0

Problemi correlati