2010-01-01 20 views
9

La mia domanda ruota attorno alla distinzione di un UISegmentedController su una UINavigationBar contro una UIToolbar. Se mi cade un UISegmentedControl in una barra di navigazione come segue:UISegmentedControl Color in a UIToolbar

navigationBar.barStyle = UIBarStyleBlackTranslucent; 

tutto va bene. UISegmentedControl identifica l'opzione selezionata con un nero leggermente più scuro. Ma se lascio UISegmentedControl su una UIToolbar, non rileva il colore o la traslucenza dalla barra degli strumenti. Se imposto manualmente tintColor, UISegmentedControl non distingue più tra selezionati e non selezionati.

Certo, uno deve avvolgere UISegmentedControl in un UIBarButtonItem prima di cadere su una UIToolbar. Mi chiedo se questo è parte del motivo per cui UISegmentedControl sembra errato (blu su sfondo nero traslucido).

toolbar.barStyle = UIBarStyleBlackTranslucent; 
UIBarButtonItem *item = [[[UIBarButtonItem alloc] initWithCustomView:segmentedControl]; 
NSArray *toolbarItems = [[NSArray alloc] initWithObjects:item,nil]; 
toolbar.items = toolbarItems; 

Certo, il mio codice non è esattamente come è scritto da quando sto usando la barra degli strumenti di navigazione e di controllo interno, ma la logica generale è la stessa. Non sono sicuro di come UISegmentedControl sulla UIToolbar abbia uno stile traslucido nero, mantenendo un'evidente distinzione tra segmenti selezionati e non selezionati.

+0

Questo aiuta: 'segmentedController.tintColor = [UIColor darkGrayColor];' ma crea una dipendenza hard-coded che preferirei non introdurre. Ad esempio, rendere leggermente più complicato consentire la selezione degli utenti di combinazioni di colori. –

+0

L'hai capito alla fine? – DenNukem

+0

Fino a quando Apple non implementa la logica di colorazione UINavigation nella UIToolbar per UISegmentedControl, sono stato relegato per utilizzare la proprietà tintColor. –

risposta

7

Sembra tipo: segmentedController.tintColor = [UIColor darkGrayColor]; risolve il problema.

Per rimuovere la "dipendenza", sottoclasse UISegmentedControl e impostare la tinta nel costruttore.

CustomSegmentedControl.m

- (id)initWithItems:(NSArray*)items { 
    if(self = [super initWithItems:items]) { 
     self.tintColor = [UIColor darkGrayColor]; 
    } 
    return self; 
} 
+0

Penso che tu stia semplicemente spostando la dipendenza, non eliminandola. Ad esempio, se cambio il colore della barra degli strumenti in "verde", dovrei andare a trovare ogni riga di codice come questa e cambiarla. Preferirei non impostare la mia app in questo modo. Voglio che la barra segmentata si "scarichi" automaticamente dal suo genitore. Effettivamente, lo fa automaticamente quando viene inserito in un UINavigationController. Se si modifica lo stile UNavigationBar in nero traslucido, ogni bambino UISegmentedController segue automaticamente la suite. –

+0

Sfortunatamente, quando un UISegmentedControl viene inserito in una UIToolbar, non riflette automaticamente l'opzione stile/colore della barra e, come hai illustrato, devo dire esplicitamente quale colore essere. In questo esempio, lo identifico come "dipendenza" e sto cercando una soluzione che non presenti quel tipo di dipendenza. Non voglio impostare il colore in più punti. –

+0

Poiché si tratta di una sottoclasse, il colore si verifica solo una volta nel codice. Questa è una caratteristica del design orientato agli oggetti. Puoi avere 100 istanze di CustomSegmentedControl nell'app, ma il colore viene indicato solo una volta. – bentford