2009-11-02 13 views
14

Alguien ha logrado colorear la parte de la barra de detección de un UISearchBar, tiene una propiedad tintColor pero su configuración no afecta la barra de alcance UISegmentedControl. Ive consiguió una manija en la barra para teñir, pero no se parece a trabajar es decir:UISearchBAR scopeBar tintColor

for (id subview in searchBar.subviews){ 
    if([subview isMemberOfClass:[UISegmentedControl class]]){ 
    UISegmentedControl *scopeBar=(UISegmentedControl *) subview; 
    scopeBar.tintColor=UIColorFromRGB(0x990066); 
} 
} 

Cheers, Neil

Respuesta

7

Esto es interesante, resulta que la barra de alcance es un control segmentado un tanto personalizada.

De los documentos: UISegmentedControl utiliza esta propiedad solo si el estilo del control segmentado es UISegmentedControlStyleBar.

Ahora la barra de alcance segmentado de control ve como UISegmentedControlStyleBar pero no es, es cierto estilo indocumentado:

NSLog(@"scope bar style is %d", scopeBar.segmentedControlStyle); 
> scope bar style is 7 

Usted puede probar esto, lo que realmente establece el tono pero se ve como el culo:

[scopeBar setSegmentedControlStyle:UISegmentedControlStyleBar]; 
[scopeBar setTintColor: UIColorFromRGB(0x990066)]; 
> scope bar style is 2 

Internamente hay algunas variables de instancia que influyen en esto: _segementedControlFlags.style y _barStyle pero no puede hackearlas a menos que omita la API autorizada.

El mejor curso de acción es plantearlo a Apple y esperar que incluya una solución en una versión futura.

+0

Desafortunadamente, como dijiste a ti mismo, esto realmente se ve como culo. – Jasarien

0

Tengo no he podido obtener el conjunto de tinte de manera confiable para una barra de alcance.

Lo que terminé haciendo es cambiar la barra de búsqueda tintColor ... HASTA pasar al modo de búsqueda, en ese punto lo hago del color predeterminado para que coincida con la barra de alcance. Luego, al cancelar la búsqueda, la cambio nuevamente.

Un punto que parece que me falta aquí es la transición que se produce cuando se toca el tableView correspondiente, lo que hace que la barra de búsqueda pierda el estado de primera respuesta. En ese caso, el color no cambia de nuevo. Motivo: baso ese cambio de color al hacer clic en el botón cancelar de la barra de búsqueda.

Se debe llamar a la reacción de tirón: searchBarCancelButtonClicked: (en la que cambiamos el tono) ... pero eso no puede ser correcto, porque no se hizo clic en Cancelar. Realmente necesito un tipo de detección de "Búsqueda realizada". Tal vez solo vigile la primera respuesta y vea cuando UISearchBar se mueve dentro y fuera de ese estado?

4

Aquí hay un código para copiar el código de compatibilidad de lo que los otros están discutiendo.

scopeBar.segmentedControlStyle = UISegmentedControlStyleBar; //required for color change 
for (id subview in self.searchDisplayController.searchBar.subviews) 
{ 
    if([subview isMemberOfClass:[UISegmentedControl class]]) 
    { 
     UISegmentedControl *scopeBar=(UISegmentedControl *) subview; 
     scopeBar.tintColor = [UIColor blackColor];   
    } 
} 

Si un cuadro blanco como el área alrededor de sus botones, puede cambiar el color de eso a través del constructor de interfaz.

No diría que se ve "como culo" como hacen los otros, pero tampoco es realmente ideal.

0

Otra solución de tirita para este problema (y una menos complicada) es que podría agregar un UIImageView semitransparente sobre la barra de búsqueda y la barra de alcance y cambiar el color de fondo del UIImageView al tono deseado color.

9

Los enfoques anteriores no me funcionaban y terminé usando un método de apariencia de iOS.

[[UISegmentedControl appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor whiteColor]]; 
0

enter image description here

Cambiar el color del tinte para cambiar el color de la barra de alcance. Nota BarTintColor es diferente - esto va a cambiar el color de la barra de búsqueda ..

1

Simplemente hacer lo siguiente para cambiar el color de la tinta de ScopeBar:

El siguiente código está en C# (Xamarin)

SearchController.SearchBar.TintColor = UIColor.Green;