tags:

views:

1438

answers:

3

Hi,

Has anyone managed to color the scopebar portion of a UISearchBar, it has a tintColor property but setting it does not affect the attached scopebar UISegmentedControl. Ive got a handle on the bar to tint it but doesnt seem to work ie:

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

Cheers, Neil

+1  A: 

This is interesting, turns out the scope bar is a somewhat customised segmented control.

From the docs: UISegmentedControl uses this property only if the style of the segmented control is UISegmentedControlStyleBar.

Now the scope bar segmented control looks like UISegmentedControlStyleBar but isn't, it's some undocumented style:

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

You can try this, which does actually set the tint but it looks like arse:

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

Internally there are some instance variables influencing this: _segementedControlFlags.style and _barStyle but you cannot hack those unless you bypass the sanctioned API.

The best course of action is to raise it with Apple and hope they include a fix in a future release.

Crufty
Unfortunately, as you said yourself, this really does look like arse.
Jasarien
A: 

I have not been able to get the tint set reliably for a scope bar.

What I've ended up doing is changing the search bar's tintColor ... UNTIL transitioning into search mode, at which point I make it the default color to match the scope bar. Then, when canceling the search, I change it back.

One spot that I seem to be missing here is the transition that occurs when the corresponding tableView is tapped, causing the search bar to lose first responder status. In that case, the color does not change back. Reason: I base that color change on having the search bar's cancel button being clicked.

Knee-jerk reaction: searchBarCancelButtonClicked: should get called (wherein we change back the tint) ... but that can't be right, because Cancel wasn't clicked. I really need a "Search is done" type of detection. Maybe just keep an eye on first responder and see when UISearchBar moves in and out of that state?

Joe D'Andrea
+1  A: 

Here's some copy paste friendly code for what the others are discussing.

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

If you a white box like area around your buttons, you can change the color of that through interface builder.

I wouldn't say it looks "like ass" as the others do, but it isn't really ideal either.

Tristan