15

有没有人设法为 UISearchBar 的范围栏部分着色,它有一个 tintColor 属性,但设置它不会影响附加的范围栏 UISegmentedControl。我在酒吧上有一个把手可以给它上色,但似乎不起作用,即:

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

干杯,尼尔

4

8 回答 8

9

上述方法对我不起作用,我最终使用了 iOS 外观方法。

[[UISegmentedControl appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor whiteColor]];
于 2013-09-18T01:56:30.877 回答
7

这很有趣,原来范围栏是一个有点定制的分段控件。

来自文档: UISegmentedControl 仅在分段控件的样式为 UISegmentedControlStyleBar 时才使用此属性。

现在范围栏分段控件看起来像 UISegmentedControlStyleBar 但不是,它是一些未记录的样式:

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

你可以试试这个,它确实设置了色调,但看起来很糟糕:

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

在内部,有一些实例变量会影响这一点:_segementedControlFlags.style 和 _barStyle,但除非您绕过认可的 API,否则您无法破解它们。

最好的做法是向 Apple 提出这个问题,并希望他们在未来的版本中包含一个修复程序。

于 2009-11-19T03:41:36.540 回答
4

这是其他人正在讨论的一些复制粘贴友好的代码。

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

如果您的按钮周围有一个类似白色框的区域,您可以通过界面生成器更改其颜色。

我不会说它看起来像其他人那样“像屁股”,但它也不是很理想。

于 2010-07-20T00:48:26.163 回答
1

只需执行以下操作即可更改 ScopeBar 的色调颜色:

下面的代码是在 C# (Xamarin)

SearchController.SearchBar.TintColor = UIColor.Green;
于 2016-11-21T18:50:21.413 回答
0

无法为范围栏可靠地设置色调。

我最终做的是更改搜索栏的tintColor...直到转换到搜索模式,此时我将其设置为与范围栏匹配的默认颜色。然后,在取消搜索时,我将其改回。

我似乎在这里遗漏的一个地方是当tableView点击相应按钮时发生的转换,导致搜索栏失去第一响应者状态。在这种情况下,颜色不会变回。原因:我基于单击搜索栏的取消按钮来更改颜色。

下意识的反应:searchBarCancelButtonClicked:应该被调用(其中我们改变了色调)......但这不可能是正确的,因为没有点击取消。我真的需要“搜索完成”类型的检测。也许只关注第一响应者并查看UISearchBar何时进出该状态?

于 2010-02-08T21:52:09.010 回答
0

这个问题的另一个创可贴解决方案(也是一个不太复杂的解决方案)是您可以在搜索栏和范围栏的顶部添加一个半透明的 UIImageView,并将 UIImageView 的背景颜色更改为您想要的色调。

于 2011-01-02T04:31:17.663 回答
0

在此处输入图像描述

更改色调颜色以更改范围栏的颜色。注意 BarTintColor 不同 - 这将改变搜索栏的颜色。

于 2015-02-26T12:17:14.360 回答
0

这个解决方案是在 Swift 中的,可以适应 Objective-c。您可以使用以下功能找到分段控制视图

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
}

然后设置视图的色调颜色。调用这个函数将是这样的:

if let segmentedView = findSegmentedControl(view: searchController.searchBar) {                
            segmentedView.tintColor = UIColor.white
        }
于 2018-06-10T11:31:03.680 回答