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 funzionato, non sono riuscito a trovarne uno. Tutto quello che ho trovato era:
@property BOOL forceFullHeightInLandscape;
- (BOOL)isMinibar;
Non c'è setter per -isMinibar
, quindi non possiamo impostare tale. Immagino che restituisca un valore basato sulla sua altezza. Inoltre, forceFullHeightInLandscape
è stato impostato su NO
, tuttavia non ha ancora regolato la sua altezza.
Mentre cambiare la autoresizingMask
per includere UIViewAutoresizingFlexibleHeight
, la vista fatto ridimensionamento ad essere più piccoli, ma ormai era troppo piccola. Tuttavia, -isMinibar
restituito all'improvviso YES
. Questo mi ha fatto pensare solo a ridimensionare la vista da sola, regolandola all'altezza giusta.
Così ci andiamo, un metodo che funziona, anche senza le chiamate alle API private:
- (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 otterranno regolato sulla barra più piccola, in modo che ci sia uno spazio tra la barra e le viste sottostanti. Il modo più semplice per risolverlo è aggiungere una vista container, proprio come nel caso di 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;
}
+1 per la risposta eccellente – vodkhang
Grazie per la risposta, non posso testarlo adesso ma ti riporterò una volta che l'ho provato. È interessante notare che la vista del contenitore si ridimensiona già correttamente, come se la barra di navigazione fosse diventata più corta come dovrebbe. – ryyst
L'ho provato proprio ora e funziona perfettamente! Poiché la vista del contenitore è già ridimensionata correttamente, ho solo bisogno della chiamata 'sizeToFit'. – ryyst