2012-11-05 5 views
8

Ho un'app dove fino ad ora ho usato un UINavigationController con una UINavigationBar che ha la sua proprietà translucent = YES. Ciò significa che la vista del contenuto di UINavigationController (ovvero le viste dai controller della vista che si spingono) deve essere a schermo intero (meno la barra di stato).Come si ottiene un UINavigationController per NON modificare le dimensioni della vista quando si imposta la proprietà traslucida?

Tuttavia, se si imposta navigationBar.translucent = NO, questa vista del contenitore diventa 44pt più breve, come suppongo che Apple abbia presunto che non sia necessario alcun contenuto in una barra di navigazione opaca.

... eccetto se stai facendo quello che stiamo facendo e stai utilizzando una barra di navigazione che scorre via (vedi This Post on how to do that) Quindi vorrei sapere se è possibile.

Desidero avere traslucido = NO, ma tutto si comporta come se fosse ancora impostato su SÌ. Mi piace la funzionalità del traslucido = SÌ, ma in realtà non voglio che la barra sia resa traslucida da UIKit.

risposta

0

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 
} 
+0

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

1

Non è necessariamente una buona risposta, ma potresti semplicemente compensare la tua opinione così alta se non sei traslucido.

//This won't take into account orientation and probably other details 
if(!self.navigationController.navigationBar.isTranslucent) 
{ 
    self.view.frame = CGRectMake(0,0,-44,self.view.bounds.size.height); 
} 

Si potrebbe mettere che nel tuo viewDidLoad o viewWillAppear e se si dispone di un gruppo di controller di vista si può semplicemente tutto sottoclasse e mettere la logica nella sottoclasse.

+0

hmmm ... mi viene da pensare che potrei fare qualcosa di simile in una sottoclasse di UINavigationController e non dover ingombrare i miei controller di vista con quel tipo di codice. posterò i miei risultati. Grazie! – horseshoe7

+0

sì, non è la soluzione perché quando si ispeziona la proprietà di una vista di UINavigationController in realtà occupa l'intera finestra e la dimensione della cornice non cambia mai. Deve avere una vista interna del contenitore per le viste dei controller della vista che si trovano nello stack. – horseshoe7

+1

Sì, ecco cosa sta succedendo, ecco perché dovresti fare questo codice nel tuo controller di visualizzazione se vuoi che funzioni potenzialmente. In entrambi i casi si sta andando contro il comportamento nativo e solo cambiando il comportamento del layout della vista potrebbe essere una soluzione migliore. – rooster117

0

ero alla ricerca di una risposta a questo come Volevo che i miei subviews essere a (0,0) e non (0,44) (in riferimento ai limiti dello schermo), ma non sono riuscito a trovare una risposta su come impostarlo nel NavigationController, che pensavo fosse una proprietà inclusa.

Quello che ho finito per fare è stato molto semplice aggiungere una sottoview al controller di navigazione che era la larghezza e l'altezza della barra di navigazione, ma poi inserire la sottoview sotto la barra di navigazione.

Ora l'impostazione è Translucent = YES, ma appare ancora solida e le sottoview si comportano come voglio.

MODIFICA: dopo aver riletto il tuo post originale, suppongo che se toglierai la barra di navigazione, dovrai tener conto di nascondere e mostrare la nuova sottoview mentre fai lo stesso con il nav bar

10

Quello che ha funzionato per me è stato quello di aggiungere extendedLayoutIncludesOpaqueBars = true in viewDidLoad

qualcosa di simile

override func viewDidLoad() { 
    super.viewDidLoad() 
    extendedLayoutIncludesOpaqueBars = true 
} 

Speranza che wi Lavorerò anche per te