Ho trovato una soluzione che funziona, anche se è davvero un po 'un trucco.
L'idea è di dare alla barra di navigazione traslucida un supporto opaco. Purtroppo non sono contento della soluzione in quanto è sporca e non incapsulata e introduce alcuni potenziali problemi, ma SONO felice perché ha fatto il lavoro.
In vista di base classe controllore di mia Application (cioè MyViewController: UIViewController), nel metodo viewDidLoad, ho un'istanza di un nuovo ivar UIView * _navigationBarBG e dare lo stesso telaio self.navigationController.navigationBar. Quindi ho impostato la proprietà backgroundColor su [UIColor whiteColor], anche se questo è il modo in cui si ottiene un po 'più di tinta. [EDIT: Se vuoi essere un purista (i valori dei colori rimangono esattamente come vengono dal .psd), puoi rendere _navigationBarBG un UIImageView e utilizzare lo sfondo personalizzato lì, e lo sfondo della UINavigationBar effettiva che hai impostato per disegnare (o allungare un'immagine 1px trasparente se si voleva utilizzare un tipico 'cambiare la vostra barra di navigazione utilizzando un'immagine' ricetta che da qualche parte su internet)]
if(self.navigationController)
{
_navigationBarBG = [[UIView alloc] initWithFrame: self.navigationController.navigationBar.frame];
_navigationBarBG.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_navigationBarBG];
}
ALLORA, (e questa è la parte scadente, ma io non vedo altro modo), aggiungo questa vista come sottoview. MA, ogni volta che normalmente effettui una chiamata a [self.view addSubview: anyView], devi assicurarti di chiamare [self.view insertSubview: anyView belowSubview: _navigationBarBG];
if (_navigationBarBG)
[self.view insertSubview: anyView belowSubview:_navigationBarBG];
else
[self.view addSubview: anyView];
Se si dimentica che, queste viste aggiunte scorreranno sotto lo sfondo della barra di navigazione e avranno un aspetto strano. Quindi è necessario sapere che questa è una fonte di errore.
PERCHÉ STO FACENDO QUESTO? Ancora una volta potresti chiedere ... Voglio essere in grado di avere una barra di navigazione a scorrimento che scorra quando ti sposti verso il basso nella tua vista tabella, dando così all'utente più spazio sullo schermo.Ciò viene fatto utilizzando il delegato ScrollView (scrollViewDidScroll :) e anche viewWillAppear:
// FIRST DEAL WITH SCROLLING NAVIGATION BAR
CALayer *layer = self.navigationController.navigationBar.layer;
CGFloat contentOffsetY = scrollView.contentOffset.y;
CGPoint newPosition;
if (contentOffsetY > _scrollViewContentOffsetYThreshold && self.scrollingNavigationBarEnabled) {
newPosition = CGPointMake(layer.position.x,
22 - MIN((contentOffsetY - _scrollViewContentOffsetYThreshold), 48.0)); // my nav bar BG image is 48.0 tall
layer.position = newPosition;
[_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens
}
else
{
newPosition = kNavBarDefaultPosition; // i.e. CGPointMake(160, 22) -- portrait only
layer.position = newPosition;
[_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens
}
alla fine sono andato con questa soluzione e non la risposta sopra. l'ho provato brevemente ma non ho avuto molto successo. penso che iOS esegua un sacco di re-setting del frame self.view, quindi non volevo rovinare tutto ciò. il modo in cui ho presentato solo 'piggy back' il movimento di un altro componente che so di lavorare. è solo un po 'sporco in quanto devi ricordare come inserire le sottoview e non aggiungere le sotto-visualizzazioni e verificare la presenza. ma funziona bene. – horseshoe7