Domanda

Qualcuno è riuscito a colorare la parte di uno scopebar UISearchBar, esso ha una proprietà tintColor ma l'impostazione non influisce l'allegata scopebar UISegmentedControl. Ive ha ottenuto una maniglia sulla barra per colorare, ma pretende molto sembra funzionare cioè:

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

Saluti, Neil

È stato utile?

Soluzione

Questo è interessante, scopre la barra ambito è un controllo segmentato in qualche misura.

Dalla documentazione:. UISegmentedControl utilizza questa proprietà solo se lo stile del controllo segmentato è UISegmentedControlStyleBar

Ora la barra di ambito segmentato di controllo Look come UISegmentedControlStyleBar ma non è, è un certo stile non documentato:

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

Si può provare questo, che non in realtà impostare la tinta, ma sembra che il culo:

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

Internamente ci sono alcune variabili d'istanza che influenzano questo: _segementedControlFlags.style e _barStyle ma non si può incidere quelli meno che non si bypassare l'API sanzionato

.

Il miglior modo di agire è quello di sollevarlo con Apple e la speranza che includono una correzione in una versione futura.

Altri suggerimenti

Gli approcci di cui sopra non funzionavano per me e ho finito per usare un metodo di aspetto iOS.

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

Ecco qualche copia incolla di codice da usare per quello che gli altri stanno discutendo.

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];         
    }
}

Se una casella bianca come la zona intorno i pulsanti, è possibile modificare il colore di che, attraverso la creazione di interfacce.

Non direi che sembra "come il culo", come fanno gli altri, ma non è proprio l'ideale sia.

È sufficiente eseguire le seguenti operazioni per modificare il colore tinta di ScopeBar:

Il codice che segue è in C # (Xamarin)

SearchController.SearchBar.TintColor = UIColor.Green;

ho non stato in grado di ottenere la tinta impostato in modo affidabile per un bar ambito.

Quello che ho finito per fare sta cambiando tintColor della barra di ricerca ... FINO transizione in modalità di ricerca, a quel punto mi rendono il colore di default per abbinare la barra di ambito. Poi, quando si annulla la ricerca, lo cambio indietro.

Un punto che mi sembra di essere manca qui è il passaggio che si verifica quando il tableView corrispondente è sfruttato, causando la barra di ricerca di perdere primo stato responder. In tal caso, il colore non cambia di nuovo. Motivo: Baso che cambiano colore per avere pulsante di annullamento della barra di ricerca essere cliccato

.

reazione istintiva: searchBarCancelButtonClicked: dovrebbe avere chiamato (in cui si cambia di nuovo la tinta) ... ma questo non può essere giusto, perché non è stato fatto clic su Annulla. Ho davvero bisogno di un tipo di "Ricerca è fatto" di rilevazione. Forse solo tenere d'occhio first responder e vedere quando UISearchBar si muove dentro e fuori di quello stato?

Un'altra soluzione band-aid a questo problema (e uno meno complicato) è che si potrebbe aggiungere un UIImageView semi-trasparente sopra la parte superiore della barra di ricerca e ambito bar e cambiare il colore del UIImageView sfondo per il colore della tinta desiderata .

entrare descrizione dell'immagine qui

Cambia il colore della tinta per cambiare il colore della barra di ambito. Nota BarTintColor è diverso - questo cambierà il colore della barra di ricerca ..

Questa soluzione è in Swift, adattabile a obiettivo-c. È possibile trovare la vista di controllo segmentata usando sotto la funzione

func findSegmentedControl(view : UIView) -> UIView? {
    for v in view.subviews {
        if v is UISegmentedControl {
            print(v)
            return v
        } else {
            if let found = findSegmentedControl(view : v) {
                return found
            }
        }
    }
    return nil
}

e quindi impostare il colore della tinta della vista. chiamando questa funzione sarà simile a questo:

if let segmentedView = findSegmentedControl(view: searchController.searchBar) {                
            segmentedView.tintColor = UIColor.white
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top