UISearchBAR scopeBar tintColor

后端 未结 8 1959
小蘑菇
小蘑菇 2021-02-02 15:46

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

相关标签:
8条回答
  • 2021-02-02 16:29

    Simply do the following to change the tint color of ScopeBar:

    The below code is in C# (Xamarin)

    SearchController.SearchBar.TintColor = UIColor.Green;
    
    0 讨论(0)
  • 2021-02-02 16:31

    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.

    0 讨论(0)
  • 2021-02-02 16:31

    The above approaches weren't working for me and I ended up using an iOS appearance method.

    [[UISegmentedControl appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor whiteColor]];
    
    0 讨论(0)
  • 2021-02-02 16:33

    enter image description here

    Change the tint color for changing color of scope bar. Note BarTintColor is different - this will change the color of the search bar..

    0 讨论(0)
  • 2021-02-02 16:33

    This solution is in Swift, can be adapted to objective-c. You can find the segmented control view using below function

    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
    }
    

    and then set tint color of the view. calling this function will be like this:

    if let segmentedView = findSegmentedControl(view: searchController.searchBar) {                
                segmentedView.tintColor = UIColor.white
            }
    
    0 讨论(0)
  • 2021-02-02 16:34

    Another band-aid solution to this problem (and a less complicated one) is you could add a semi-transparent UIImageView over the top of the Search bar and Scope bar and change the background color of the UIImageView to your desired tint color.

    0 讨论(0)
提交回复
热议问题