2010-01-01 16 views
9

Mi pregunta gira en torno a la distinción de un UISegmentedController en un UINavigationBar frente a una UIToolbar. Si dejo caer un UISegmentedControl en una barra de navegación de la siguiente manera:UISegmentedControl Color en una UIToolbar

navigationBar.barStyle = UIBarStyleBlackTranslucent; 

todo está bien. El UISegmentedControl identifica la opción seleccionada con un negro ligeramente más oscuro. Pero, si dejo caer un UISegmentedControl en una UIToolbar, no recoge el color o la translucidez de la barra de herramientas. Si configuro manualmente el tintColor, el UISegmentedControl ya no distingue entre seleccionado y no seleccionado.

Es cierto que uno debe envolver el UISegmentedControl en un UIBarButtonItem antes de colocarlo en una UIToolbar. Me pregunto si eso es parte de la razón por la que el UISegmentedControl parece incorrecto (azul sobre un fondo negro translúcido).

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

Por supuesto, mi código no es exactamente como está escrito desde que estoy usando la barra de herramientas de navegación y control interno, pero la lógica general es la misma. No estoy seguro de cómo hacer que UISegmentedControl en la UIToolbar tenga un estilo negro translúcido, manteniendo una distinción obvia entre segmentos seleccionados y no seleccionados.

+0

Esto ayuda: 'segmentedController.tintColor = [UIColor darkGrayColor];' pero crea una dependencia codificada que prefiero no introducir. Por ejemplo, haciéndolo un poco más complicado para permitir la selección de combinaciones de colores por parte del usuario. –

+0

¿Lo descubriste al final? – DenNukem

+0

Hasta que Apple implemente la lógica de coloreado de UINavigation en la barra de columnas de UIT para UISegmentedControl, he sido relegado para usar la propiedad tintColor. –

Respuesta

7

Parece que: segmentedController.tintColor = [UIColor darkGrayColor]; resuelve su problema.

Para quitar la "dependencia", subclase UISegmentedControl y establecer el tinte en el constructor.

CustomSegmentedControl.m

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

Creo que solo está moviendo la dependencia, no deshacerse de ella. Por ejemplo, si cambio el color de la barra de herramientas a "verde", tendré que buscar y encontrar cada línea de código como esta y cambiarla. Prefiero no configurar mi aplicación así. Quiero que la barra segmentada se "alimente" automáticamente de su padre. De hecho, lo hace automáticamente cuando se coloca en un UINavigationController. Si cambia el estilo UNavigationBar a negro translúcido, cualquier UISegmentedController secundario sigue automáticamente el conjunto. –

+0

Desafortunadamente, cuando un UISegmentedControl se coloca dentro de una UIToolbar, no refleja automáticamente la opción de estilo/color de la barra de herramientas y, como lo ha ilustrado, debo decir explícitamente qué color es. En este ejemplo, estoy identificando eso como una "dependencia" y estoy buscando una solución que no introduzca ese tipo de dependencia. No quiero establecer el color en varios lugares. –

+0

Como esta es una subclase, el color solo aparece una vez en el código. Esta es una característica del diseño orientado a objetos. Puede tener 100 instancias CustomSegmentedControl en su aplicación, pero el color solo se indica una vez. – bentford